Sprng 往IOC容器中添加組件的幾種方式,可能你只知道第一種

通過@ComponentScan @Controller @Service @Respository @Component

① @ComponentScan

相當於XML中配置的

<code><component-scan>。/<component-scan>/<code>

使用方法如下,

<code>@ComponentScan(value = "com.yj.controller")
public class BeanConfig {

}/<code>

在 @ComponentScan 註解中指定了要掃描的包。

Spring 會掃描 com.yj.controller 下的所有類。

使用場景: 針對我們自己寫的組件可以通過該方式來進行加載到容器中

② @Controller

用於標註控制層,相當於SpringMvc 中的 控制層

③ @Service

用於標註服務層,主要用來進行業務的邏輯處理

④ @Respository

用於標註數據訪問層,也可以說用於標註數據訪問組件,即DAO組件.

泛指組件,當組件不好歸類的時候,我們可以使用這個註解

通過@Bean的方式來導入組件(實用於導入第三方組件的類)


比如:

<code>
@Configuration
public class MyAppConfig {
    //將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
    @Bean
    public HelloService helloService02(){
        System.out.println("配置類@Bean給容器中添加組件了...");
        return new HelloService();
    }
}/<code>


1、配置類@Configuration------>Spring配置文件

2、使用@Bean給容器中添加組件,相當於XML中共的<bean> 標籤


通過@Import來導入 組件(導入組件的id為全類名路徑)


<code>@Configuration
//@Import(value = {Person.class, Car.class})
//@Import(value = {Person.class, Car.class, YjImportSelector.class})
@Import(value = {Person.class, Car.class, YjImportSelector.class, YjBeanDefinitionRegister.class})
public class MainConfig {
}/<code>

通過@Import 的ImportSeletor類實現組件的導入 (導入組件的id為全類名路徑)

<code>public class YjImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.yj.testimport.compent.Dog"};
}
}/<code>

通過@Import的 ImportBeanDefinitionRegister導入組件 (可以指定bean的名稱)


<code>public class YjBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Cat.class);
registry.registerBeanDefinition("cat",rootBeanDefinition);
}
}/<code>

通過實現FactoryBean接口來實現註冊組件


Spring 通過反射機制利用<bean>標籤的class 屬性來實例化beande , 在有些情況下,實例化Bean的方式比較複雜,則需要在bean標籤中提供大量的配置信息。/<bean>

這時偶爾們可以通過實現Spring提供的一個FactoryBean接口,用戶可以通過實現該接口定義實例化 Bean的邏輯。

比如我們定義一個生產 Car 的 工廠bean

<code>public class CarFactoryBean implements FactoryBean {
   
    /返回bean的對象
    @Override

    public Car getObject() throws Exception {
        return new Car();
    }
   
    /返回bean的類型
    @Override
    public Class> getObjectType() {
        return Car.class;
    }
   
    /是否為單利
    @Override
    public boolean isSingleton() {
        return true;
    }
}
/<code>


<code>
<beans> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean>

<bean>
<property>
/<bean>

/<beans>/<code>


<code>@Configuration
@ImportResource(locations = {"classpath:beans.xml"})
public class MainConfig {
@Bean
public CarFactoryBean carFactoryBean() {
return new CarFactoryBean();
}
}
/<code>


分享到:


相關文章: