JAVA-Spring註解方式實現IOC和DI

1.Spring註解java

  Spring除了默認的使用xml配置文件的方式實現配置以外,也支持使用註解的方式實現配置,這種方式效率更高,配置信息更清晰,修改更方便,推薦使用。web

  所謂註解就是給程序看的提示信息,不少時候都是用來作爲輕量級配置的方式。spring

  關於註解的知識點,能夠看我上篇隨筆內容。app

2.Spring引入context名稱空間dom

  在MyEclipse中導入spring-context-3.2.xsd約束文件,要求Spring來管理。ide

  在applicationContext.xml文件中,引入該schema文件:this

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:context="http://www.springframework.org/schema/context"
 4         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5         xsi:schemaLocation="http://www.springframework.org/schema/beans 
 6         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
 7         http://www.springframework.org/schema/context
 8         http://www.springframework.org/schema/context/spring-context-3.2.xsd
 9         ">
10 </beans>

    **能夠將以上頭信息加入MyEclipse模板中,方便後續自動生成使用。spa

3.Spring註解實現IOCprototype

  (1)開啓包掃描code

      在spring的配置文件中,開啓包掃描,指定spring自動掃描哪些個包下的類。只有在指定的掃描包下的類上的IOC註解纔會生效。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" 
 3         xmlns:context="http://www.springframework.org/schema/context"
 4         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5         xsi:schemaLocation="http://www.springframework.org/schema/beans 
 6         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
 7         http://www.springframework.org/schema/context
 8         http://www.springframework.org/schema/context/spring-context-3.2.xsd
 9         ">
10         <!-- 開啓包掃描 -->
11         <context:component-scan base-package="cn.tedu.beans"></context:component-scan>
12         <!-- 
13                 <bean id="person" class="cn.tedu.beans.Person"></bean>        
14                 <bean id="cat" class="cn.tedu.beans.Cat"></bean>        
15                 <bean id="dog" class="cn.tedu.beans.Dog"></bean>        
16          -->
17 </beans>

  (2)使用註解註冊bean

    在配置的包中的類上使用@Component註解,則這個類會自動被註冊成爲bean,使用當前類的class爲<bean>的class,一般狀況下使用類名首字母小寫爲<bean>id

    案例:

    

1 package cn.tedu.beans;
2 import org.springframework.stereotype.Component;
3 
4 @Component
5 public class Person{
6 }

  (3)bean的id

    一般狀況下註解註冊bean使用類名首字母小寫爲bean的id,可是若是類名第二個字母爲大寫則首字母保留原樣。

  

1 cn.tedu.beans.Person --> <bean id="person" class="cn.tedu.beans.Person"/>
2 cn.tedu.beans.PErson --> <bean id="PErson" class="cn.tedu.beans.Person"/>
3 cn.tedu.beans.NBA --> <bean id="NBA" class="cn.tedu.beans.NBA"/>

  也能夠經過在@Component中配置value屬性,明確的指定bean的id

  案例:

    **可使bean實現BeanNameAware接口,並實現其中的setBeanName方法。

    spring容器會在初始化bean時,調用此方法告知當前bean的id。經過這個方式能夠獲取bean的id信息。

 1 package cn.tedu.beans;
 2 import org.springframework.beans.factory.BeanNameAware;
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.beans.factory.annotation.Qualifier;
 5 import org.springframework.stereotype.Component;
 6 
 7 @Component("per")
 8 public class Person implements BeanNameAware{
 9         @Override
10         public void setBeanName(String name) {
11                 System.out.println("==="+this.getClass().getName()+"==="+name);
12         }
13 }

4.Spring註解方式實現DI

  (1)在配置文件中開啓註解實現DI

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:context="http://www.springframework.org/schema/context"
 4         xmlns:util="http://www.springframework.org/schema/util"
 5         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6         xsi:schemaLocation="http://www.springframework.org/schema/beans 
 7         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
 8         http://www.springframework.org/schema/context
 9         http://www.springframework.org/schema/context/spring-context-3.2.xsd
10         http://www.springframework.org/schema/util
11         http://www.springframework.org/schema/util/spring-util-3.2.xsd
12         ">
13         <!-- 開啓IOC包掃描 -->
14         <context:component-scan base-package="cn.tedu.domain"/>
15         <!-- 開啓註解配置DI -->
16         <context:annotation-config></context:annotation-config>
17 </beans>

  (2)註解方式注入spring內置支持的類型數據 - 非集合類型

    spring中能夠經過@Value來實現spring內置支持的類型的屬性的注入。

  

 1 package cn.tedu.domain;
 2 
 3 import org.springframework.beans.factory.annotation.Value;
 4 import org.springframework.stereotype.Component;
 5 
 6 @Component
 7 public class Student {
 8         @Value("zs")
 9         private String name;
10         
11         @Value("19")
12         private int age;
13         
14         @Override
15         public String toString() {
16                 return "Student [name=" + name + ", age=" + age + "]";
17         }
18 }

    這種方式能夠實現spring內置支持類型的注入,可是這種方式將注入的值寫死在了代碼中,後續若是但願改變注入的值,必須來修改源代碼,此時能夠將這些值配置到一個properties配置文件中,再從spring中進行引入

 

   (3)註解方式注入spring內置支持的數據類型 - 集合類型

      將spring-util-3.2xsd交給MyEclipse管理

      在當前spring容器的配置文件中導入util名稱空間

      在經過適當的util標籤註冊數據

      案例:

      

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:context="http://www.springframework.org/schema/context"
 4         xmlns:util="http://www.springframework.org/schema/util"
 5         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6         xsi:schemaLocation="http://www.springframework.org/schema/beans 
 7         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
 8         http://www.springframework.org/schema/context
 9         http://www.springframework.org/schema/context/spring-context-3.2.xsd
10         http://www.springframework.org/schema/util
11         http://www.springframework.org/schema/util/spring-util-3.2.xsd
12         ">
13         <!-- 開啓IOC包掃描 -->
14         <context:component-scan base-package="cn.tedu.domain"/>
15         <!-- 開啓註解配置DI -->
16         <context:annotation-config></context:annotation-config>
17         <!-- 引入Properties文件 -->
18         <context:property-placeholder location="classpath:/stu.properties"/>
19         
20         <!-- 配置集合數據 -->
21         <util:list id="l1">
22                 <value>aaa</value>
23                 <value>bbb</value>
24                 <value>ccc</value>
25         </util:list>
26         <util:set id="s1">
27                 <value>111</value>
28                 <value>222</value>
29                 <value>333</value>
30         </util:set>
31         <util:map id="m1">
32                 <entry key="k1" value="v1"></entry>
33                 <entry key="k2" value="v2"></entry>
34                 <entry key="k3" value="v3"></entry>
35         </util:map>
36         <util:properties id="p1">
37                 <prop key="p1">v1</prop>
38                 <prop key="p2">v2</prop>
39                 <prop key="p3">v3</prop>
40         </util:properties>
41 </beans>

    再在類的屬性中經過@Value注入賦值

 1 package cn.tedu.domain;
 2 
 3 import java.util.List;
 4 import java.util.Map;
 5 import java.util.Properties;
 6 import java.util.Set;
 7 
 8 import org.springframework.beans.factory.annotation.Value;
 9 import org.springframework.stereotype.Component;
10 
11 @Component
12 public class Student {
13         @Value("${name}")
14         private String name;
15         
16         @Value("${age}")
17         private int age;
18         
19         @Value("#{@l1}")
20         private List<String> list;
21         
22         @Value("#{@s1}")
23         private Set<String> set;
24         
25         @Value("#{@m1}")
26         private Map<String,String> map;
27         
28         @Value("#{@p1}")
29         private Properties prop;
30         
31         @Override
32         public String toString() {
33                 return "Student [name=" + name + ", age=" + age + ", list=" + list
34                                 + ", set=" + set + ", map=" + map + ", prop=" + prop + "]";
35         }
36         
37 }

  (4)使用註解注入自定義bean類型數據

    在bean中的屬性上經過@Autowired實現自定義bean類型的屬性注入代碼:

    

 1 package cn.tedu.domain;
 2 
 3 import java.util.List;
 4 import java.util.Map;
 5 import java.util.Properties;
 6 import java.util.Set;
 7 
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.beans.factory.annotation.Value;
10 import org.springframework.stereotype.Component;
11 
12 @Component
13 public class Student {
14         @Autowired
15         private Dog dog;
16         
17         @Autowired
18         private Cat cat;
19         
20         @Override
21         public String toString() {
22                 return "Student [dog="+ dog + ", cat=" + cat + "]";
23         }
24         
25 }

    當spring容器解析到@Component註解時,會建立當前類的bean在spring容器中進行管理,在建立bean的過程當中發現了@Autowired註解,會根據當前bean屬性名稱,尋找在spring中是否存在id等於該名稱的bean,若是存在則自動注入,若是不存在,在檢查是否存在和當前bean屬性類型相同的bean,若是存在就注入,否在拋出異常。

    也可使用@Qualifier(value="dog1")註解,明確的指定要注入哪一個id的bean

  **也可使用@Resource(name="id")指定注入給定id的bean,可是這種方式不建議使用。

5.其餘註解

  @Scope(value="prototype")

    配置修飾的類的bean是單例或者多例,若是不配置默認爲單例

    案例:

1 package cn.tedu.domain;
2 
3 import org.springframework.context.annotation.Scope;
4 import org.springframework.stereotype.Component;
5 
6 @Component
7 @Scope("prototype")
8 public class Teacher {
9 }

  @Lazy

    配置修飾的類的bean採用懶加載機制

    案例:

  

 1 package cn.tedu.domain;
 2 
 3 import org.springframework.context.annotation.Lazy;
 4 import org.springframework.stereotype.Component;
 5 
 6 @Component
 7 @Lazy
 8 public class Teacher {
 9         public Teacher() {
10                 System.out.println("teacher construct..");
11         }

  @PostConstruct

    在bean對應的類中,修飾某個方法,將該方法聲明爲初始化方法,對象建立以後當即執行。

  @PreDestroy

    在bean對應的類中,修飾某個方法,將該方法聲明爲銷燬的方法,對象銷燬以前調用的方法。

 案例:

 1 package cn.tedu.beans;
 2 import javax.annotation.PostConstruct;
 3 import javax.annotation.PreDestroy;
 4 import org.springframework.stereotype.Component;
 5 
 6 @Component
 7 public class Dog {
 8     public Dog() {
 9         System.out.println("Dog...被建立出來了...");
10     }
11     
12     @PostConstruct
13     public void init(){
14         System.out.println("Dog的初始化方法。。。");
15     }
16     
17     @PreDestroy
18     public void destory(){
19         System.out.println("Dog的銷燬方法。。。");
20     }
21 }

  @Controller     @Service     @Repository     @Component

    這四個註解的功能是徹底同樣的,都是用來修飾類,將類聲明爲Spring管理的bean的。

    其中@Component通常認爲是通用的註釋

    而@Controller用在軟件分層的控制層,通常在web層

    而@Service用在軟件分層中的訪問層,通常用在service層

    而@Repository用在軟件分層的數據訪問層,通常在dao層

相關文章
相關標籤/搜索