context:component-scan標簽:
Sprng容器通過context:component-scan標簽掃描其base-package標簽屬性值指定的包及其子包內的所有的類並實例化被@Component、@Repository、@Service或@Controller等注解所修飾的類。
@Component:基本注解
@Respository:持久層(一般為dao層)注解
@Service:服務層或業務層(一般為service層)注解
@Controller:控制層(一般為controller層)注解
默認情況下Spring依據默認命名策略為通過注解實例化的對象命名:類名第一個字母小寫. 也可以在注解中通過@Component、@Repository、@Service或@Controller注解的value屬性標識名稱。
bean內屬性賦值:
Sprng容器通過context:component-scan標簽掃描時還會自動實例化AutowiredAnnotationBeanPostProcessor 類, 該實例對象可以自動裝配具有 @Autowired 和 @Resource 或@Inject注解的屬性。
@Autowired
1、成員變量(不考慮訪問權限)、構造函數或setter方法都可以使用@Autowired注解
2、默認情況下@Autowired 注解依據類型自動為成員變量賦值,當 IOC 容器里存在多個類型相同的 Bean 對象時就會依據成員變量名進行賦值,此時要求變量名必須是多個Bean對象中的一個,否則就會出現異常, 該異常可以通過在 @Qualifier 注解指定實例名的方式解決;
3、默認情況下,通過@Authwired 注解為成員變量賦值時,如果Spring 找不到匹配的 Bean為成員變量賦值則會拋出異常;如果該成員變量允許不被設置, 可以設置 @Authwired 注解的 required 屬性為 false;
操作如下所示:
//創建一個類 package com.zzj.vo; import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; //使用Component基本注解 @Component public class School { //bean內屬性賦值 @Autowired
//從多個實現類中選擇需要的,如果不加當有多個實現類時會報錯 @Qualifier("b") private Date birth; public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } }
<!--application.xml--> <bean id="b" class="java.util.Date"></bean> <bean id="p" class="java.util.Date"></bean> <!--Spring掃描com.zzj.vo包中Date類,由於該類使用了@Component注解,所以該類被實例化--> <context:component-scan base-package="com.zzj.vo"></context:component-scan>
//測試類 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); System.out.println(context.getBean(School.class).getBirth());
注意:
1、使用context:component-scan標簽需要添加spring-aop-4.3.10.RELEASE.jar包
2、base-package標簽屬性屬性值:
a、Spring 容器將會掃描該屬性值指定包及其子包中的所有類;
b、該屬性值支持*通配符,例如“com.lq.*.imp”表示掃描諸如com.lq.book.imp包及其子包中的類;
c、當需要掃描多個包時, 使用逗號分隔;
d、resource-pattern標簽屬性可以指定Spring容器僅掃描特定的類而非基包下的所有類,比如resource-pattern="/*.class"表示只掃描基包下的類,基包的子包不會被掃描。
context:component-scan子標簽:
1、<context:include-filter> 子標簽設定Spring容器掃描時僅掃描哪些expression指定的類,該子標簽需要和context:component-scan父標簽中的use-default-filters屬性一起使用;
2、<context:exclude-filter>子標簽設定Spring容器掃描時不掃描哪些expression指定的類;
<context:component-scan base-package="com.zzj.vo"> <context:exclude-filter type="annotation" expression=""/> <context:include-filter type="annotation" expression=""/> </context:component-scan>
