Spring学习3:自动装配与注解开发
Posted Z|Star
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring学习3:自动装配与注解开发相关的知识,希望对你有一定的参考价值。
自动装配
手动装配
为了说明如何使用自动装配,先用手动装配构建一个例子。
例子说明:创建一个User来控制一个Cat,使用Cat的shout方法。(一个人让自己的猫叫)
1.新建cat类
public class Cat {
public void shout() {
System.out.println("miao~");
}
}
2.新建User类
public class User {
private Cat cat;
private Dog dog;
private String str;
public void setCat(Cat cat) {
this.cat = cat;
}
public void setStr(String str) {
this.str = str;
}
public Cat getCat() {
return cat;
}
}
3.编写beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="user" class="com.kuang.pojo.User">
<property name="cat" ref="cat"/>
</bean>
</beans>
4.编写测试程序
import com.kuang.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = context.getBean("user",User.class);
user.getCat().shout();
}
}
5.运行结果:
在这个例子里面,用xml对对象进行装配,bean标签的ref代表装配beans中已经注册过的对象。
byName按名称自动装配
具体使用:
为了对比,先把上个例子中手动装配的部分筛选出来:
<bean id="user" class="com.kuang.pojo.User">
<property name="cat" ref="cat"/>
</bean>
通过property标签进行装配。
现在,删除这一个标签,新增一个autowire。
<bean id="user" class="com.kuang.pojo.User" autowire="byName"></bean>
这样,会实现和上面同样的效果。
原理分析:
byName是按照名称进行自动装配。
在beans.xml中,之前已经对cat进行创建。
<bean id="cat" class="com.kuang.pojo.Cat"/>
将这个对象的id取名为cat,而在User类中,同样有这个cat。
//User.java
public class User {
private Cat cat;
private String str;
public void setCat(Cat cat) {
this.cat = cat;
}
public void setStr(String str) {
this.str = str;
}
public Cat getCat() {
return cat;
}
}
Spring会自动将两者联系,进行装配。
也就是说,在这种模式下,如果修改其id为cat2,那么就会报错。
byType按类型自动装配
具体使用:
现在,把autowire的属性改为byType。
<bean id="cat2" class="com.kuang.pojo.Cat"/>
<bean id="user" class="com.kuang.pojo.User" autowire="byType"></bean>
现在发现,即使把cat对象的id改成cat2,依旧能正常运行。
原理分析:
byType是按类型自动装配,也就是通过class进行匹配。
在使用时需注意:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。
使用注解进行自动装配
上面介绍了如何通过autowire属性值来实现自动装配,下面将记录如何用注解来实现自动装配。
简单使用
1.首先需要修改beans.xml文件,引入context文件头。
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
并开启注解支持:
<context:annotation-config/>
完整文件头:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
xmlns:context="http://www.springframework.org/schema/context">
<context:annotation-config/>
</beans>
2.在配置文件中创建cat和User两个对象。
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="user" class="com.kuang.pojo.User"></bean>
3.给cat对象添加@Autowired注解,删除setCat()方法。
@Autowired
private Cat cat;
完整User.java:
package com.kuang.pojo;
import org.springframework.beans.factory.annotation.Autowired;
public class User {
@Autowired
private Cat cat;
private String str;
public void setStr(String str) {
this.str = str;
}
public Cat getCat() {
return cat;
}
}
4.运行测试程序,效果一样。
与@Qualifier配合使用
遇到相同类,但不同id的多个对象,需要和@Qualifier配合使用。
例如
<bean id="cat1" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>
如果需要装配到cat2,可以这样注解。
@Autowired
@Qualifier(value = "cat2")
private Cat cat;
拓展总结
除了@Autowired注解可以实现自动装配外,@Resource也可以实现相同的效果。
两者的不同之处:
@Autowired先byType,后byName。
@Resource先byName,后byType。
注解开发
之前的例子均是在beans.xml文件中进行配置,现在不使用xml配置,采用纯Java的方式,即JavaConfig。
1.编写一个实体类,Dog
import org.springframework.stereotype.Component;
@Component //将这个类标注为Spring的一个组件,放到容器中!
public class Dog {
public String name = "dog";
}
2.新建一个config配置包,编写一个MyConfig配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //代表这是一个配置类
public class MyConfig {
@Bean //通过方法注册一个bean,这里的返回值就Bean的类型,方法名就是bean的id!
public Dog dog(){
return new Dog();
}
}
3.进行测试
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
Dog dog = (Dog) applicationContext.getBean("dog");
System.out.println(dog.name);
}
}
4.成功输出结果
以上是关于Spring学习3:自动装配与注解开发的主要内容,如果未能解决你的问题,请参考以下文章