Java之Spring基础与IoC (3)

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 scopes

bean的作用域

Java之Spring基础与IoC

singleton

默认bean为scope = singleton单例模式运行的

显示定义:<bean p:name="zh1z3ven1" p:age="18" scope="singleton"/>

Java之Spring基础与IoC

单例模式,共享一个对象,比如如下例子,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容器内创建一次该对象

Java之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" 就会跑出异常。

Java之Spring基础与IoC

Java之Spring基础与IoC

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpdxj.html