注解方式實例化Java類


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>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM