bean的注入有方式注入:
- xml配置注入
- Java配置注入
- 自动配置注入
xml配置注入:
1、普通构造方法注入
在Spring的配置文件中声明你要注入的对象 例如:User
<bean class="com.itbaizhan.User" id="user1"/>
所谓的声明,就是将自己的信息告诉Spring容器,例如id和class,Spring容器根据class,通过反射(默认使用的是无参构造方法)就可以创建一个名为user1的User对象。
初始化Spring容器:
@Before
public void before(){
ac = new ClassPathXmlApplicationContext("applicationContext.xml");
}
初始化Spring容器后,可以看到User对象被创建出来了:
@Test
public void test01(){
User user = (User) ac.getBean("user");
System.out.println(user);
}
注意:上面的这种初始化方式,要求User类必须有一个无参构造方法,如果没有无参构造方法,会抛出如下异常:
No default constructor found; nested exception is java.lang.NoSuchMethodException: com.itbaizhan.User.<init>()
我们也可以通过类型直接获取一个bean的实例:
@Test
public void test02(){
User user = ac.getBean(User.class);
System.out.println(user);
}
注意:区别Spring配置文件中id和name:
在实际开发中,可以忽略id和name的区别,可以混用。 这两个是有区别的:
- id="user1,user2,user3"表示bean有一个名字,这个名字就是user1,user2,user3
- name="user1,user2,user3"表示bean有多个名字,多个名字分别是user1、user2以及user3
2、静态工厂注入
1、定义类的静态工厂方法:
public class UserFactory {
public static User getInstance() {
return new User();
}
}
2、在xml文件中进行配置: 配置时注意指定静态工厂类以及静态方法
<bean class="com.sxt.factory.UserFactory" id="factory" factory-method="getInstance"/>
3、获取相应的实例:
@Test
public void test04(){
User user = (User) ac.getBean("factory");
System.out.println(user);
}
3、实例工厂注入
实例工厂注入与静态工厂注入基本一致,主要区别体现在工厂方法是不是静态方法 实例工厂方法:
public class UserFactory2 {
public User getInstance2() {
return new User();
}
}
注意:实例工厂配置,在xml文件中配置中,首先要先配置实例工厂的类,首先获取实例工厂的实例,然后再配置要 获取的实例类,通过factory-bean属性进行实例工厂的获取配置,获取想要获取的实例对象。
配置如下:
<bean class="com.sxt.factory.UserFactory02" id="userFactory02"/>
<bean class="com.sxt.pojo.User" id="user1" factory-bean="userFactory02" factory-method="getInstance02"/>
属性注入
1、构造方法注入
在xml中进行配置:
<bean class="com.itbaizhan.Book" id="book1">
<constructor-arg name="id" value="1"/>
<constructor-arg name="name" value="三国演义"/>
<constructor-arg name="author" value="罗贯中"/>
</bean>
也可以通过下标定位参数:
<bean class="com.itbaizhan.Book" id="book2">
<constructor-arg index="0" value="2"/>
<constructor-arg index="1" value="红楼梦"/>
<constructor-arg index="2" value="曹雪芹"/>
</bean>
2、set方法注入
set方法注入就是利用对象属性的set方法给属性赋值,实际上,相当于首先使用无参构造方法创建一个对象,然后调用对象中的set方法给各个属性赋值。 配置如下:
<bean class="com.itbaizhan.Book" id="book3">
<property name="author" value="施耐庵"/>
<property name="id" value="3"/>
<property name="name" value="水浒传"/>
</bean>
3、P名称空间注入
p名称空间注入本质上还是set方法注入,只是写法不同(注意:p名称空间注入,需要有无参构造方法)。写法如下:
<bean class="com.itbaizhan.Book" id="book4" p:id="4" p:author="吴承恩" p:name="西游记"/>
这种注入方式了解即可,实际开发中使用较少。