Spring中使用注解代替xml配置


在配置文件中指定掃描哪個包下的文件

 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注解,在對象銷毀前調用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM