Spring註解配置

a

配置文件:

 

複製代碼
 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" xmlns:context="http://www.springframework.org/schema/context"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 5         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 6     
 7 
 8     <!--context:component-scan 指定 掃描的包 -->
 9     <!--可以通過 resource-pattern 指定掃描的資源, resource-pattern="myrepository/*.class" 
10         的含義: 只掃描 base-package 對應包下的 目錄爲 myrepository 的所有java Bean -->
11     <!-- <context:component-scan base-package="imooc_spring.test.anotation" 
12         resource-pattern="myrepository/*.class"></context:component-scan> -->
13 
14     <!-- 
15         context:exclude-filter type="annotation"
16             expression="org.springframework.stereotype.Repository" 
17             子節點指定排除哪些註解
18         context:include-filter type="annotation"    需要結合context:component-scan 標籤的
19         use-default-filters="false"來使用
20             
21         context:exclude-filter type="assignable"
22             這個expression指的是自己寫的類,意思排除哪些類
23             expression="imooc_spring.test.anotation.TestObj"
24      -->
25     <context:component-scan base-package="imooc_spring.test.anotation" >
26         <!-- <context:exclude-filter type="annotation"
27             expression="org.springframework.stereotype.Repository" /> -->
28             
29         <context:exclude-filter type="assignable"
30             expression="imooc_spring.test.anotation.TestObj" />
31     </context:component-scan>
32 </beans>
複製代碼

 

@Repository註解:

 

複製代碼
 1 package imooc_spring.test.anotation.myrepository;
 2 
 3 import org.springframework.stereotype.Repository;
 4 
 5 /**
 6  * 指定id,默認爲dAO,即類名首字母小寫,如果指定了名稱那麼只能ctx.getBean(指定名稱)來獲取bean
 7  * 這個例子裏就只能通過ctx.getBean("wyldao)來獲取DAO 的實例了;
 8  * 
 9  * @author Wei
10  */
11 @Repository("wyldao")
12 public class DAO {
13     /**
14      * 返回x和y的乘積
15      * 
16      * @param x
17      * @param y
18      * @return x*y
19      */
20     public int multi(int x, int y) {
21         return x * y;
22     }
23 }
複製代碼

 

@Component 註解:

 

複製代碼
 1 package imooc_spring.test.anotation;
 2 
 3 import org.springframework.stereotype.Component;
 4 /**
 5  * Component 註解
 6  * @author Wei
 7  *
 8  */
 9 @Component
10 public class TestObj {
11     public void SayHi(){
12         System.out.println("\nHi this is TestObj.SayHi()...");
13     }
14 }
複製代碼

 

@Controller註解:

複製代碼
 1 package imooc_spring.test.anotation;
 2 
 3 import org.springframework.stereotype.Controller;
 4 
 5 @Controller
 6 public class UserController {
 7     public void execute(){
 8         System.out.println("\nUserController.execute()...");
 9     }
10 }
複製代碼

 

@Repository註解:

複製代碼
 1 package imooc_spring.test.anotation;
 2 
 3 import org.springframework.stereotype.Repository;
 4 
 5 //@Repository
 6 @Repository("wyl_repo")
 7 public class UserRepositoryImpl implements IUserRepository {
 8 //模擬持久化層
 9     @Override
10     public void save() {
11         // TODO Auto-generated method stub
12         System.out.println("\nUserRepositoryImpl.save()...");
13     }
14 
15 }
複製代碼

 

@Service註解:

複製代碼
 1 package imooc_spring.test.anotation;
 2 
 3 import org.springframework.stereotype.Service;
 4 
 5 @Service
 6 public class UserService {
 7     public void add(){
 8         System.out.println("\nUserService.add()...");
 9     }
10 }
複製代碼

 

2.另外一組註解:

@Autowired、@Resource 這兩個註解的功能可以說是一樣的,前面一組註解的功能也是類似的。

@Autowired 註解自動裝配具有兼容類型的單個 Bean屬性

可以用來標識 

1 構造器,

2 普通字段(即使是非 public),

3 一切具有參數的方法

這三種都可以應用@Authwired 註解

默認情況下, 所有使用 @Authwired 註解的屬性都需要被設置. 當 Spring 找不到匹配的 Bean 裝配屬性時, 會拋出異常, 若某一屬性允許不被設置, 可以設置 @Authwired 註解的 required 屬性爲 false

 

@Resource 和 @Inject 註解,這兩個註解和 @Autowired 註解的功用類似

@Resource 註解要求提供一個 Bean 名稱的屬性,若該屬性爲空,則自動採用標註處的變量或方法名作爲 Bean 的名稱

@Inject 和 @Autowired 註解一樣也是按類型匹配注入的 Bean, 但沒有 reqired 屬性

建議使用 @Autowired 註解

 

 

複製代碼
 1 package imooc_spring.test.anotation;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Service;
 5 
 6 @Service
 7 public class UserService {
 8     @Autowired(required=false)
 9     public UserRepositoryImpl rep ;
10     
11     public void add(){
12         System.out.println("\nUserService.add()...");
13     }
14 }
複製代碼

 

複製代碼
 1 package imooc_spring.test.anotation;
 2 
 3 import org.springframework.stereotype.Repository;
 4 
 5 //@Repository
 6 @Repository("wyl_repo")
 7 public class UserRepositoryImpl implements IUserRepository {
 8 //模擬持久化層
 9     @Override
10     public void save() {
11         // TODO Auto-generated method stub
12         System.out.println("\nUserRepositoryImpl.save()...");
13     }
14 
15 }
複製代碼

 

 

@Autowired(required=false)

這個就相當於IOC容器裏的ref屬性,比如

複製代碼
1 <bean id="people" class="test.spring.autowired.Person" scope="prototype"
2         autowire="byName">
3         <property name="name" value="小明"></property>
4         <property name="cat" ref="cat222"></property>
5 </bean>
6 <bean id="cat222" class="test.spring.autowired.Cat">
7       <property name="name" value="我是小喵喵"></property>
8 </bean>
複製代碼

 

整個IOC容器:

複製代碼
 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" xmlns:context="http://www.springframework.org/schema/context"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 5         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 6     <bean id="moocAppctx" class="imooc_spring.test.aware.MoocApplicationContext"
 7         init-method="hhhh">
 8     </bean>
 9 
10     <!--context:component-scan 指定 掃描的包 -->
11     <!--可以通過 resource-pattern 指定掃描的資源, resource-pattern="myrepository/*.class" 
12         的含義: 只掃描 base-package 對應包下的 目錄爲 myrepository 的所有java Bean -->
13     <!-- <context:component-scan base-package="imooc_spring.test.anotation" 
14         resource-pattern="myrepository/*.class"></context:component-scan> -->
15 
16     <!-- context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" 
17         子節點指定排除哪些註解 context:include-filter type="annotation" 需要結合context:component-scan 
18         標籤的 use-default-filters="false"來使用 context:exclude-filter type="assignable" 
19         這個expression指的是自己寫的類,意思排除哪些類 expression="imooc_spring.test.anotation.TestObj" -->
20     <context:component-scan base-package="imooc_spring.test.anotation">
21         <!-- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" 
22             /> -->
23 
24         <!-- <context:exclude-filter type="assignable" expression="imooc_spring.test.anotation.TestObj" 
25             /> -->
26 
27 
28     </context:component-scan>
29 
30 </beans>
複製代碼

 

 

中的ref,一個bean引用另一個bean,上面的例子中就是 

UserService 這個bean引用 UserRepositoryImpl 這個bean,

當然了,使用這些註解的時候都需要結合

<context:component-scan base-package="imooc_spring.test.anotation">
</context:component-scan>

來一起使用。

@Autowired(required=false)

中的required屬性可以不寫,不寫的時候默認爲required=true,表示如果沒有找到要引用的bean,那麼引用的這個bean就爲null,

但是這樣子的話可能會由於引用的bean屬性爲null,從而可能會引起空指針異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章