spring_(13)通過註解配置之二
阿新 • • 發佈:2018-11-21
元件裝配
-
< context:component-scan >元素還會自動註冊AutowiredAnnotationBeanPostProcessor例項,該例項可以自動裝配具有@Autowired和@Resource、@Inject註解的屬性
-
@Autowired註解自動裝配具有相容型別的單個Bean屬性
- 構造器,普通欄位(即使是非public),一切具有引數的方法都可以應用@Authwired註解
- 預設情況下,所有使用@Authwired註解的屬性都需要被設定.當Spring找不到匹配的Bean裝配屬性時,會丟擲異常,
- 預設情況下,當IOC容器裡存在多個型別相容的Bean時,通過型別的自動裝配將無法工作。此時可以在**@Qualifier**註解裡提供Bean的名稱。Spring允許對方法入參標註@Qualifiter已指定注入Bean的名稱
- @Authwired註解也可以應用在陣列型別的屬性上,此時Spring將會把所有匹配的Bean進行自動裝配
- @Authwired註解也可以應用在集合屬性上,此時Spring讀取該集合的型別資訊,然後自動裝配所有與之相容的Bean
- @Authwired註解用在java.util.Map
-
### 使用@Resource或@Inject自動裝配Bean,- Spring還支援@Resource和@Inject註解,這兩個註解和@Autowired註解的功能類似,- @Resource註解要求提供一個Bean名稱的屬性,若該屬性為空,則自動採用標註的標量或方法名作為Bean的名稱,- @Inject和@Autowired註解一樣也是按型別匹配注入的Bean,但沒有reqired屬性,- 建議使用@Autowired註解
例子程式
基本結構
還有一個上文的配置檔案.xml
TestObject.java
package com.spring.beans.annotation;
public class TestObject {
}
UserRepository.java
package com.spring.beans.annotation.repository;
public interface UserRepository {
void save();
}
UserRepositoryImpl.java
package com.spring.beans.annotation.repository;
import com.spring.beans.annotation.TestObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository("userRepository")//這裡的名字可以讓多個repository存在時,找到這個repository
public class UserRepositoryImpl implements UserRepository {
@Autowired(required = false)
private TestObject testObject;
@Override
public void save() {
System.out.println("UserRepository Save...");
System.out.println(testObject);
}
}
UserJdbcRepository.java
package com.spring.beans.annotation.repository;
import org.springframework.stereotype.Repository;
@Repository
public class UserJdbcRepository implements UserRepository{
@Override
public void save() {
System.out.println("UserJdbcRepository save...");
}
}
UserService.java
package com.spring.beans.annotation.service;
import com.spring.beans.annotation.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
@Qualifier("userRepositoryImpl") //指定裝配哪一個repository
private UserRepository userRepository;
//另外一種方法
// @Autowired
// public void setUserRepository(@Qualifier("userRepositoryImpl") UserRepository userRepository) {
// this.userRepository = userRepository;
// }
public void add(){
System.out.println("UserService add...");
userRepository.save();
}
}
beans-annotation.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--指定spring IOC 容器掃描的包-->
<!--可以通過resource-pattern指定掃描的資源-->
<!--<context:component-scan
base-package="com.spring.beans.annotation"
resource-pattern="repository/*.class">
</context:component-scan>-->
<!--exclude-filter 子節點指定排除哪些指定表示式的元件-->
<!--context:include-filter 子節點指定包含哪些表示式的元件,該子節點需要 use-default-filters 配合使用-->
<context:component-scan
base-package="com.spring.beans.annotation">
<!-- 只包含時需要新增這個屬性use-default-filters="false"-->
<!--不包含<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.spring.beans.annotation.repository.UserRepository"/>-->
<!--只包含這個介面以及介面的實現類<context:include-filter type="assignable" expression="com.spring.beans.annotation.repository.UserRepository"/>-->
</context:component-scan>
</beans>
Main.java
package com.spring.beans.annotation;
import com.spring.beans.annotation.controller.UserController;
import com.spring.beans.annotation.repository.UserRepository;
import com.spring.beans.annotation.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-annotation.xml");
// TestObject to = (TestObject) ctx.getBean("testObject");
// System.out.println(to);
UserController userController =(UserController) ctx.getBean("userController");
System.out.println(userController);
userController.execute();
// UserService userService = (UserService) ctx.getBean("userService");
// System.out.println(userService);
//
// UserRepository userRepository = (UserRepository) ctx.getBean("userRepository");
// System.out.println(userRepository);
}
}
執行結果