Spring(二)——IOC
程序员文章站
2022-03-19 15:00:40
...
IOC(BeanFactory)
- IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
- Spring 提供两种IOC容器实现的两种方式:(两个接口)
(1)BeanFactory
IOC容器最基本实现方式,一般都不提供给开发人员进行使用,是Spring框架自己内部的使用的接口,在加载配置文件后,一般只会找到该类,但是不会立马去加载配置文件,在获取(使用)对象的时候才会创建,这也是利用了懒汉式模式
(2)ApplicationContext:
BeanFactory 接口的子接口,提供更强大的功能,一般都是开发人员使用,而且找到该类后就会创建对象,这也是利用了饿汉式模式 - ApplicationContext的接口实现类
IOC操作Bean管理(概念)
-
什么是Bean管理
Bean 管理是指两个操作: Spring创建对象、 Spring注入属性
IOC操作Bean管理(基于xml方式)
-
基于xml方式创建对象
前文提到,通过注解就可实现,这里就不把代码重写了
(1)在spring 配置文件中,使用bean标签,标签里面添加对应的属性,就可以实现对象创建
(2)在bean标签有很多属性,常用的属性
id属性:唯一标识符
class属性:类全路径(包类路径)
(3)创建对象时,默认的也是无参构造方法完成对象的创建 -
基于xml文件方式注入属性
DI:依赖注入,注入属性 -
DI中两种注入属性的方法,一种是setter方法,一种是构造器方法注入
(1)settter方法注入
第一步;创建一个类,让类拥有setter方法
IDEA中alt+insert键可以直接生成
public class Music {
//创建属性
private String musician; //歌手
private String musicname; //歌曲名
public void setMusician(String musician) {
this.musician = musician;
}
public void setMusicname(String musicname) {
this.musicname = musicname;
}
//重写toString方法,便于打印输出美观
@Override
public String toString() {
return "Music{" +
"musician='" + musician + '\'' +
", musicname='" + musicname + '\'' +
'}';
}
}
第二步:在spring配置文件对象创建,配置属性注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--spring配置文件,setter方法让属性注入-->
<bean id="music" class="spring5_demo01.bean.Music">
<!--
使用property 完成属性注入
name:类里面的属性
value:类里面的值
类似于键值对的形式
-->
<property name="musician" value="许嵩"></property>
<property name="musicname" value="素颜"></property>
</bean>
</beans>
第三步:测试
@Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring3.xml");
Music music = (Music) context.getBean("music");
System.out.println(music.toString());
}
测试的结果,发现值已经被注入了
(2)第二种构造器参数注入,使用有参构造进行注入
第一步,正常创建一个类,并设置一个构造方法
public class Email {
//创建属性
private String emailTo; //收件人
private String emailFrom; //发件人
//创建一个有参构造函数
public Email(String emailTo, String emailFrom) {
this.emailTo = emailTo;
this.emailFrom = emailFrom;
}
@Override
public String toString() {
return "Email{" +
"emailTo='" + emailTo + '\'' +
", emailFrom='" + emailFrom + '\'' +
'}';
}
}
第二步:写spring 配置文件
有参构造函数的写法
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="email" class="spring5_demo01.bean.Email">
<constructor-arg name="emailTo" value="梅西"></constructor-arg>
<constructor-arg name="emailFrom" value="粉丝"></constructor-arg>
</bean>
</beans>
第三步:测试
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring4.xml");
Email email = (Email) context.getBean("email");
System.out.println(email.toString());
}
测试成功!
初次之外,还有p名称空间注入,在p名称的配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/p
http://www.springframework.org/schema/p/spring-beans.xsd">
<bean id="email" class="spring5_demo01.bean.Email">
<constructor-arg name="emailTo" value="梅西"></constructor-arg>
<constructor-arg name="emailFrom" value="粉丝"></constructor-arg>
</bean>
<bean id="email1" class="spring5_demo01.bean.Email" p:emailTo="C罗" p:emilFrom="C罗粉丝"></bean>
</beans>
这里就不具体讲解了,可以自己去了解!