@Autowired、@Resource、和@Service注解详解
注解之前spring怎么装配bean
传统的Spring做法是使⽤.xml⽂件来对bean进⾏注⼊或者是配置aop、事务。我们先看⼀个不使⽤注解的Spring⽰例,在这个⽰例的基础上,改成注解版本的,这样也能看出使⽤与不使⽤注解之间的区别,先定义⼀个⽼师:
public class Teacher{
private String teacherName = "TW";
public String toString() {
return "TeacherName:" + teacherName;
}
}
复制代码
再定义⼀个学⽣:
public class Student{
private String studentName = "SL";
public String toString() {
return "StudentName:" + studentName;
}
}
复制代码
然后定义⼀个学校:
public class School{
private Teacher teacher;
private Student student;
public void setTeacher(Teacher teacher){
}
public void setStudent(Student student){
this.student = student;
}
public Teacher getTeacher(){
return teacher;
}
public Student getStudent(){
return student;
}
public String toString(){
return teacher + "\n" + student;
}
}
复制代码
spring的配置⽂件这么写:
<?xml version="1.0" encoding="UTF-8"?>
<bean id="school" class="bean.School" >
<property name="teacher" ref="teacher" />
<property name="student" ref="student" />
</bean>
<bean id="teacher" class="uu.Teacher" />
<bean id="student" class="uu.Student" />
复制代码
这是最初始的.xml配置,很显然这么做有两个缺点:
1. 如果所有的内容都配置在.xml⽂件中,会导致.xml⽂件过⼤;如果按需求分开.xml⽂件,⼜会导致.xml⽂件过多。总之这会使得配置⽂
件的可读性与可维护性变得很低。
2. 开发中,在.java⽂件和.xml⽂件之间不断切换,是⼀件⿇烦的事。同时这种思维上的不连贯也会降低开发的效率。
为了解决这两个问题,Spring引⼊了注解,通过@注解名的⽅式,让注解与Java Bean紧密结合,既⼤
⼤减少了配置⽂件的体积,⼜增加了Java Bean的可读性与内聚性。
@Autowired
顾名思义,就是⾃动装配。其作⽤是替代Java代码⾥⾯的getter/setter与bean属性中的property。如果私有属性需要对外提供的话,getter应当予以保留。引⼊@Autowired注解,先看⼀下spring配置⽂件怎么写:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns:xsi="/2001/XMLSchema-instance"
3    xmlns="/schema/beans"
4    xmlns:context="/schema/context"
5    xsi:schemaLocation="/schema/beans
6        /schema/beans/spring-beans-4.2.xsd
7        /schema/context
8        /schema/context/spring-context-4.2.xsd">
9
10    <context:component-scan base-package="" />
11
12    <bean id="school"  class="bean.School" />
13    <bean id="teacher" class="uu.Teacher" />
14    <bean id="student" class="uu.Student" />
15
16 </beans>
复制代码
注意第10⾏,为了实现bean的⾃动载⼊,必须配置spring的扫描器。
在base-package指明⼀个包:
<context:component-scan base-package=“”/>
复制代码
表明包及其⼦包中,如果某个类的头上带有特定的注解@Component、@Repository、@Service或@Controller,就会将这个对象作为Bean注⼊进spring容器。
看到第12⾏,原来school⾥⾯应当注⼊两个属性teacher、student,现在不需要注⼊了。再看下,School.java也很简练,把getter/setter都可以去掉:
public class School{
@Autowired
private Teacher teacher;
@Autowired
private Student student;
public String toString(){
return teacher + "\n" + student;
}
}
复制代码
这⾥@Autowired注解的意思就是,当Spring发现@Autowired注解时,将⾃动在代码上下⽂中到与其匹配(默认是类型匹配)的Bean,并⾃动注⼊到相应的地⽅去。
@Resource
@Resource注解作⽤与@Autowired⾮常相似。先看⼀下@Resource,直接写School.java了:
public class School{
@Resource(name = "teacher")
private Teacher teacher;
@Resource(type = Student.class)
private Student student;
public String toString(){
return teacher + "\n" + student;
}
}
复制代码
这是详细⼀些的⽤法,说⼀下@Resource的装配顺序:
1. @Resource后⾯没有任何内容,默认通过name属性去匹配bean,不到再按type去匹配。
2. 指定了name或者type则根据指定的类型去匹配bean。
3. 指定了name和type则根据指定的name和type去匹配bean,任何⼀个不匹配都会报错。
@Autowired和@Resource两个注解的区别:
1. @Autowired默认按照byType⽅式进⾏bean匹配,@Resource默认按照byName⽅式进⾏bean匹配
2. @Autowired是Spring的注解,@Resource是J2EE的注解,根据导⼊注解的包名就可以知道。
3. Spring属于第三⽅的,J2EE是Java⾃⼰的东西。因此,建议使⽤@Resource注解,以减少代码和Spring之间的耦合。
@Service
使⽤@Service,可以更加简化.xml⽂件配置。
因为spring的配置⽂件⾥⾯还有12⾏~14⾏三个bean,应⽤spring配置⽂件⾥⾯⼀个⾃动扫描的标签,可以把这三个bean也给去掉,增强Java代码的内聚性并进⼀步减少配置⽂件。先看⼀下配置⽂件:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns:xsi="/2001/XMLSchema-instance"
3    xmlns="/schema/beans"
4    xmlns:context="/schema/context"
5    xsi:schemaLocation="/schema/beans
6        /schema/beans/spring-beans-4.2.xsd
7        /schema/context
8        /schema/context/spring-context-4.2.xsd">
9
10    <context:component-scan base-package="" />
11 </beans>
复制代码
配置⽂件看起来特别清爽。School.java,Teacher.java和Student.java分别做如下修改:
@Service
public class School{
@Autowired
private Teacher teacher;
@Autowired
private Student student;
public String toString(){
return teacher + "\n" + student;
}
resource和autowired注解的区别}
复制代码
@Service
public class Teacher{
private String teacherName = "TW";
public String toString() {
return "TeacherName:" + teacherName;
}
}
复制代码
@Service
public class Student{
private String studentName = "SL";
public String toString() {
return "StudentName:" + studentName;
}
}
复制代码
这样,School.java在Spring容器中存在的形式就是"school",即可以通过ApplicationContext的getBean("school")⽅法来得到School.java。
@Service注解,其实做了两件事情:
1. 声明School.java是⼀个bean。这点很重要,因为School.java是⼀个bean,其他的类才可以使⽤@Autowired将School作为⼀个成员变
量⾃动注⼊。
2. School.java在bean中的id是"school",即类名且⾸字母⼩写。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。