Spring06:AutoWired自动装配
AutoWired自动装配
现在由Person,Dog,Cat
Person里有Dog和Cat
以前的做法是Person里通过set或构造器设置Dog和Cat
现在利用autowired属性或者@AutoWired注释搞定
下面演示普通做法,属性,注释三种情况
普通做法
- 写三个类 package com.xxx; public class Cat { public void show() { System.out.println("我是猫猫,喵喵喵..."); } } package com.xxx; public class Dog { public void show() { System.out.println("我是狗狗,汪汪汪..."); } } package com.xxx; import org.springframework.beans.factory.annotation.Autowired; public class Person { private Cat cat; private Dog dog; public void setCat(Cat cat) { this.cat = cat; } public void setDog(Dog dog) { this.dog = dog; } public void show() { System.out.println("我是人,牵着猫猫和狗狗..."); cat.show(); dog.show(); } }
- 写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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <bean id="cat" class="com.xxx.Cat"/> <bean id="dog" class="com.xxx.Dog"/> <bean id="person" class="com.xxx.Person"> <property name="dog" ref="dog"/> <property name="cat" ref="cat"/> </bean> </beans>
- 写测试类 import com.xxx.Person; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTest { @Test public void test01() { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); Person person = context.getBean("person", Person.class); person.show(); } }
属性
- 写三个类同上
- 写xml 注意这里没有开启属性注解支持 需要写set方法,不写会报错 <?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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 开启属性注解支持--> <!-- <context:annotation-config/>--> <bean id="cat" class="com.xxx.Cat"/> <bean id="dog" class="com.xxx.Dog"/> <bean id="person" class="com.xxx.Person" autowire="byName" /> </beans>
- 测试同上
注释
注释不需要set方法
- 变量声明上面加@Autowired
- 写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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 开启属性注解支持--> <context:annotation-config/> <bean id="cat" class="com.xxx.Cat"/> <bean id="dog" class="com.xxx.Dog"/> <bean id="person" class="com.xxx.Person"/> </beans>
- 类中dog和cat不需要set方法,只需要在定义前面加上@AutoWired注解即可 注意点: @AutoWired注解可以带参数,@Autowired(required = false) 默认是true,如果是false对象可以为null,如果为true对象不能为null @AutoWired默认是定位dog和cat装配,比如Cat必须是cat,加上@Qualifier则按指定的name装配 @Autowired @Qualifier(value = "cat1") @Resource注解 高级方式,先通过byName,再通过byType,最后再报错 @Resource(name = “dog”)或者@Resource的方式使用 如果带name参数先按name的名字寻找装配体 找不到则按默认的byName装配 最后按byType装配,不成功则报异常
思考:这种方式,不需要写set方法,还是得写bean标签
