前言
Spring是我们开发中的核心框架,传统的xml配置文件十分繁琐,所以在Spring2.5以后,程序员可以使用注解来配置依赖注入,而不是大量的在xml文件中配置,我们可以使用相关类、方法或字段的注解,将繁琐的xml配置移植到类本身。
方式一:半注解半xml配置文件实现依赖注入
首先,先来介绍一些必要的注解及其使用。 @Component 该注解使用于类上面,相当于配置文件中的:
<bean class=""/>
那么如何给bean的id赋值呢?我们不妨从@Component源代码中寻找答案
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
String value() default "";
}
可以看到,类中有一个value属性,而且默认为"",它就表示bean的id属性。当我们需要给bean赋id值的时候,我们通过在注解中给value赋值。比如:
@Component(value = “xxx”)
也可以这样写:
@Component(“xxx”)
@Component泛指各种组件,此注解还衍生出了三个和它一样的注解: @Controller 一般用于表现层(web层)的注解 @Service 一般用于业务层(service层)的注解 @Repository 一般用于持久层(dao层)的注解 @Scope @Scope注解的作用就是来调节对象的作用域。 此注解可以指定五种作用域
1. singleton单例模式(默认) 仅有一个该类的实例 2. prototype在这里插入代码片 原型模式 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 3. request 每一次http请求都会产生一个新的bean,作用域相当于servlet中的request作用域 4. session 每一次http请求都会产生一个新的bean,作用域相当于servlet中的session作用域 5. global session 在web中相当于session类型
举例 我们以学生和学校为例,先创建学校类School:
@Component("school")
public class School {
@Value("bju")
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
'}';
}
}
创建学生类Student:
@Component("student")
@Scope(value = "prototype")
public class Student {
@Value("zhangsan")
private String name;
@Value("15")
private int age;
@Resource(name = "school")
private School school;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}
}
需要注意的是xml配置文件:
<context:annotation-config></context:annotation-config>
<context:component-scan base-package="com.jiawen"/>
这两项配置缺一不可,有了它们,Spring才会扫描并识别出你的注解。 测试代码:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = (Student) context.getBean("student");
System.out.println(student);
}
运行结果:
Student{name=‘zhangsan’, age=15, school=School{name=‘bju’}}
方式二:全注解实现依赖注入
同样,我们介绍一下必要的注解及其使用。 @Configuration Configuration的主要功能是用来注册Bean,它使用在类的上面,相当于一个Spring的XML配置文件,与@Bean配合使用。 @Bean Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。 可以通过@Bean(name = “xxx”)的方式来指定bean的id属性 @Bean需要在@Configuration注解下的类使用。 @ComponentScan 此注解相当于xml配置文件中的 <context:component-scan base-package="com.jiawen"/> 使用此注解时,我们要指定base-package属性,用法为:
@ComponentScan(basePackages = “xxx.xxxx…”)
举例 我们仍以学校和学生为例,上文中的School和Student类不变,我们新增加一个beans类:
@Configuration
@ComponentScan(basePackages = "com.jiawen")
public class beans {
@Bean(name = "school")
public School getSchool(){
return new School();
}
@Bean(name = "student")
public Student getStudent(){
return new Student();
}
}
测试代码:
@Test
public void test(){
ApplicationContext context = new AnnotationConfigApplicationContext(beans.class);
Student student = (Student) context.getBean("student");
System.out.println(student);
}
与上种方式测试代码不同的是,这次我们使用了AnnotationConfigApplicationContext ,当我们使用全注解开发时,就不能再使用ClassPathXmlApplicationContext 了。 运行结果:
Student{name=‘zhangsan’, age=15, school=School{name=‘bju’}}
总结
基于注解开发是我们必须要掌握的技能,无论是全xml配置、半注解半xml配置还是全注解方式,都有它的优点与弊端。我们在实际开发中,千万不能“随自己喜欢的方式”或者“图方便”,一定要根据项目的具体情况来决定用哪种方式。
|