c命名空间注入,通过构造器注入,类似于construct-args(需要实现有参构造)
xmlns:c="http://www.springframework.org/schema/c" <bean c:name="zh1z3ven2" p:age="19"/> @Test public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); User user1 = context.getBean("user1", User.class); System.out.println(user1.getName()); System.out.println(user1.getAge()); User user2 = context.getBean("user2", User.class); System.out.println(user2.getName()); System.out.println(user2.getAge()); } Bean scopesbean的作用域
singleton默认bean为scope = singleton单例模式运行的
显示定义:<bean p:name="zh1z3ven1" p:age="18" scope="singleton"/>
单例模式,共享一个对象,比如如下例子,getBean指向的是同一个bean,那么在Spring IoC容器中仅仅会生成一个"user2"对象保存在内存中,当调用ApplicationContext.getBean("user2")时返回该对象
<bean c:name="zh1z3ven2" c:age="19"/> @Test public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); User user1 = context.getBean("user2", User.class); User user2 = context.getBean("user2", User.class); System.out.println(user1==user2); } prototype原型模式prototype与singleton不同,每次上下文去getBean()时都会在Spring IoC容器内创建一次该对象
还是拿上面的测试代码,可以发现已经不是同一个对象了,有点类似于多态
public void test2(){ ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); User user1 = context.getBean("user2", User.class); User user2 = context.getBean("user2", User.class); System.out.println(user1==user2); }而其余的生命周期在Web中才会遇到。
Bean的自动装配在xml显示配置bean
在java代码中配置bean
隐式自动装配bean【autowire】
byName autowire会在容器上下文中自动查找,和自己对象set方法后面的值对应的beanid。也就是这里会去上下文中寻找有无"cat"这个beanid,有则自动装配,如果并没有匹配上,比如此时beanid被修改为了"cat123" 就会跑出异常。
byType autowire会在容器上下文中寻找该类型与属性值所对应的类型相同的bean,基于bean中的class(需要在上下文中所有类型各自只出现一次)
<bean autowire="byType"> <property value="zh1z3ven"/> </bean> 小结byname需要保证所有bean的id唯一,且这个bean的id的值要和需要自动装配依赖注入的set方法的值一致。
bytype需要保证所有bean的class唯一,且这个bean的class的值需要和set方法的值的类型一致。
注解实现自动装配xml配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd https://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> </beans> @Autowired默认使用byname方式去自动装配,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
在使用@Autowired时,首先在容器中查询对应类型的bean(bytype)
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据名称来查找。(byname)
如果查询的结果为空,那么会抛出异常。解决方法时,使用@Autowried(required=false)
public class People { @Autowired private Cat cat; @Autowired private Dog dog; private String name; @Qualifier如果存在多个类型且该类型有多个不同名字的对象,那么只用@Autowired会找不到该对象,可以配合@Qualifier(value="")来指定一个装配的值。
@Autowired @Qualifier(value="dog222") @Resource