javascript
Spring配置形式之基于注解的方式
在classpath中掃描組件
組件掃描(component scanning): Spring 能夠從 classpath 下自動掃描, 偵測和實例化具有特定注解的組件.
特定組件包括:
@Component: 基本注解, 標識了一個受 Spring 管理的組件
@Respository: 標識持久層組件
@Service: 標識服務層(業務層)組件
@Controller: 標識表現層組件
對于掃描到的組件, Spring 有默認的命名策略: 使用非限定類名, 第一個字母小寫. 也可以在注解中通過 value 屬性值標識組件的名稱
base-package 屬性指定一個需要掃描的基類包,Spring 容器將會掃描這個基類包里及其子包中的所有類.
當需要掃描多個包時, 可以使用逗號分隔.
如果僅希望掃描特定的類而非基包下的所有類,可使用 resource-pattern 屬性過濾特定的類,示例:
<context:include-filter> 子節點表示要包含的目標類
<context:exclude-filter> 子節點表示要排除在外的目標類
<context:component-scan> 下可以擁有若干個 <context:include-filter> 和 <context:exclude-filter> 子節點
<context:include-filter> 和 <context:exclude-filter> 子節點支持多種類型的過濾表達式:
<context:component-scan> 元素還會自動注冊 AutowiredAnnotationBeanPostProcessor 實例, 該實例可以自動裝配具有 @Autowired 和 @Resource 、@Inject注解的屬性.
使用@Autowired
@Autowired 注解自動裝配具有兼容類型的單個 Bean屬性
-構造器, 普通字段(即使是非 public), 一切具有參數的方法都可以應用@Authwired 注解
-默認情況下, 所有使用 @Authwired 注解的屬性都需要被設置. 當 Spring 找不到匹配的 Bean 裝配屬性時, 會拋出異常, 若某一屬性允許不被設置, 可以設置 ? ? ? ? ? @Authwired 注解的 required 屬性為 false
-默認情況下, 當 IOC 容器里存在多個類型兼容的 Bean 時, 通過類型的自動裝配將無法工作. 此時可以在 @Qualifier 注解里提供 Bean 的名稱. Spring 允許對方法的 ? ? ? ? 入參標注 @Qualifiter 已指定注入 Bean 的名稱
-@Authwired 注解也可以應用在數組類型的屬性上, 此時 Spring 將會把所有匹配的 Bean 進行自動裝配.
-@Authwired 注解也可以應用在集合屬性上, 此時 Spring 讀取該集合的類型信息, 然后自動裝配所有與之兼容的 Bean.
-@Authwired 注解用在 java.util.Map 上時, 若該 Map 的鍵值為 String, 那么 Spring 將自動裝配與之 Map 值類型兼容的 Bean, 此時 Bean 的名稱作為鍵值
使用@Autowired或@Inject自動裝配Bean
Spring 還支持 @Resource 和 @Inject 注解,這兩個注解和 @Autowired 注解的功用類似
@Resource 注解要求提供一個 Bean 名稱的屬性,若該屬性為空,則自動采用標注處的變量或方法名作為 Bean 的名稱
@Inject 和 @Autowired 注解一樣也是按類型匹配注入的 Bean, 但沒有 reqired 屬性
建議使用 @Autowired 注解
相關代碼:
結構:
UserController.java
@Controller public class UserController {@Autowiredprivate UserService userService;public void execute(){System.out.println("UserController execute...");userService.add();} }UserRepository.java
public interface UserRepository {void save(); }UserJdbcRepository.java
@Repository public class UserJdbcRepository implements UserRepository{@Overridepublic void save() {System.out.println("UserJdbcRepository save..."); } }UserRepositoryImpl.java
@Repository public class UserRepositoryImpl implements UserRepository{@Autowired(required=false)private TestObject testObject;@Overridepublic void save() {System.out.println("UserRepository Save...");System.out.println("testObject"); } }UserService.java
@Service public class UserService {private UserRepository userRepository; @Autowiredpublic void setUserRepository(@Qualifier("userRepositoryImpl") UserRepository userRepository) {this.userRepository = userRepository;}public void add(){System.out.println("UserService add...");userRepository.save();} }TestObject.java
public class TestObject {}Main.java
public class Main {public static void main(String[] args) {ApplicationContext context=new ClassPathXmlApplicationContext("bean-annotation.xml"); // TestObject testObject=(TestObject) context.getBean("testObject"); // System.out.println(testObject); UserController userController=(UserController) context.getBean("userController");System.out.println(userController);userController.execute();// UserService userService=(UserService) context.getBean("userService"); // System.out.println(userService); // // UserRepository userRepository=(UserRepository) context.getBean("userRepository"); // System.out.println(userRepository); } }bean-annotation.xml
<!-- 指定spring ioc容器掃描的包 --><!-- 可以通過resource-pattern="repository/*.class"指定掃描的資源 --><!--<context:component-scan base-package="com.yslf.annotation" resource-pattern="repository/*.class"></context:component-scan>--><!-- context:exclude-filter子節點指定排除哪些指定表達式的組件 --><!--context:include-filter子節點指定包含哪些表達式的組件,該子節點需要use-default-filters="false"配合 --><!-- --><!-- --><context:component-scan base-package="com.yslf.annotation"><!--<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>--><!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>--><!-- <context:exclude-filter type="assignable" expression="com.yslf.annotation.repository.UserRepository"/>--><!-- <context:include-filter type="assignable" expression="com.yslf.annotation.repository.UserRepository"/>--> </context:component-scan>?
轉載于:https://www.cnblogs.com/zhlzy/p/7271768.html
總結
以上是生活随笔為你收集整理的Spring配置形式之基于注解的方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 4912 Paths on th
- 下一篇: 方法覆写