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标签