首页 > 技术文章 > Spring中使用注解代替xml配置

cyxdn 2017-12-04 23:18 原文

在配置文件中指定扫描哪个包下的文件

 1 <?xml version= "1.0" encoding ="UTF-8" ?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xmlns:context="http://www.springframework.org/schema/context"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans
 6                 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 7 
 8     <!--指定扫描某个包下的所有类中的注解,如果这个包下还有子包,子包也会被扫描-->
 9     <context:component-scan base-package="spr"></context:component-scan>
10 
11 
12 </beans>

 

1、Spring的@Component衍生出三个注解:

      @Service-------Service层

      @Controller-------------Web层

      @Repository---------------dao层

通过再括号内指定字符串可指定创建对象的名称

@Service("user")

 

2、修改对象的作用范围:bean元素的scope属性使用@Scope(scopeName="")来指定

 1 package spr;
 2 
 3 import org.springframework.context.annotation.Scope;
 4 import org.springframework.stereotype.Component;
 5 
 6 @Component("user")
 7 @Scope(scopeName ="prototype")
 8 public class User {
 9     private String name;
10     private Integer age;
11     private Car car;
12     public Car getCar() {
13         return car;
14     }
15     public void setCar(Car car) {
16         this.car = car;
17     }
18 
19     public String getName() {
20         return name;
21     }
22 
23     public void setName(String name) {
24         this.name = name;
25     }
26 
27     public Integer getAge() {
28         return age;
29     }
30 
31     public void setAge(Integer age) {
32         this.age = age;
33     }
34 
35     public void init(){
36         System.out.println("初始化方法");
37     }
38     public void destroy(){
39         System.out.println("销毁方法");
40     }
41 
42     @Override
43     public String toString() {
44         return "User{" +
45                 "name='" + name + '\'' +
46                 ", age=" + age +
47                 ", car=" + car +
48                 '}';
49     }
50 }

测试类

 1 package Test;
 2 
 3 
 4 import org.springframework.context.ApplicationContext;
 5 import org.springframework.context.support.ClassPathXmlApplicationContext;
 6 import spr.User;
 7 
 8 public class DemoTest {
 9 
10     @org.junit.Test
11     public void fun1() throws Exception {
12         //1、创建容器对象,从类路径下去加载xml的配置文件
13         ApplicationContext ac=new ClassPathXmlApplicationContext("\\applicationContext.xml");
14         User u1=(User)ac.getBean("user");
15         User u2=(User)ac.getBean("user");
16         User u3=(User)ac.getBean("user");
17         System.out.println(u1==u3);
18     }
19 }

因为scope设置为了多例模式prototype,所以每次从容器中取出Bean的时候都会创建一个新的对象,所以输出为false

 

值类型注入

3、普通类型注入@Value

       有两种方法:   在对应的变量上添加;在对应变量的set方法上进行添加

        在对应的变量上添加相当于通过反射在filed域上进行赋值,破坏了封装性,所以不建议采用

              

          

        如果注解中的属性只有一个且是value的时候,value=可以省略直接写@Value("18")

 4、引用类型注入

          1)自动装配 @Autowired

          2)自动装配 @Autowired+强制使用名称注入@Qualifer

              如果匹配到多个类型一致的对象,将无法选择具体注入哪个对象时,可以使用@Qualifer注入

           3)手动注入@Resource,指定注入哪个名称的对象,推荐使用此种方式

             

 1 package spr;
 2 
 3 import org.springframework.beans.factory.annotation.Value;
 4 import org.springframework.stereotype.Component;
 5 
 6 @Component("car")
 7 public class Car {
 8     @Value("black")
 9     private String color;
10     @Value("benchi")
11     private String name;
12 
13     public String getColor() {
14         return color;
15     }
16 
17     public void setColor(String color) {
18         this.color = color;
19     }
20 
21     public String getName() {
22         return name;
23     }
24 
25     public void setName(String name) {
26         this.name = name;
27     }
28 
29     @Override
30     public String toString() {
31         return "Car{" +
32                 "color='" + color + '\'' +
33                 ", name='" + name + '\'' +
34                 '}';
35     }
36 }
1 <bean name="car2" class="spr.Car">
2         <property name="name" value="mycar"></property>
3         <property name="color" value="red"></property>
4     </bean>
 1 package spr;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.beans.factory.annotation.Qualifier;
 5 import org.springframework.beans.factory.annotation.Value;
 6 import org.springframework.context.annotation.Scope;
 7 import org.springframework.stereotype.Component;
 8 
 9 @Component("user")
10 @Scope(scopeName ="prototype")
11 public class User {
12     private String name;
13 
14     @Value(value = "18")
15     private Integer age;

//使用自动注入的方式注入配置文件中name为car2的对象
16 @Autowired 17 @Qualifier("car2") 18 private Car car; 19 public Car getCar() { 20 return car; 21 } 22 public void setCar(Car car) { 23 this.car = car; 24 } 25 26 public String getName() { 27 return name; 28 } 29 30 public void setName(String name) { 31 this.name = name; 32 } 33 34 public Integer getAge() { 35 return age; 36 } 37 38 @Value(value = "18") 39 public void setAge(Integer age) { 40 this.age = age; 41 } 42 43 public void init(){ 44 System.out.println("初始化方法"); 45 } 46 public void destroy(){ 47 System.out.println("销毁方法"); 48 } 49 50 @Override 51 public String toString() { 52 return "User{" + 53 "name='" + name + '\'' + 54 ", age=" + age + 55 ", car=" + car + 56 '}'; 57 } 58 }

因为有两个car的注入方式,所以系统配置User对象的时候可以使用@Qualifer方式强制注入某个name的Car对象。

 

5、init-method destroy-method属性对应的注解

    @PostConstruct注解,在对象创建后调用

     @PreDestroy注解,在对象销毁前调用

 

推荐阅读