1. 程式人生 > 程式設計 >基於spring三方包類注入容器的四種方式小結

基於spring三方包類注入容器的四種方式小結

如果引用第三方jar包,肯定是不能直接使用常用註解@Controller、@Service、@Repository、@Component將類的例項注入到spring容器中。以下四種方法可以向spring容器中匯入三方包中類例項 。

1 xml配置

這種情況大家用的比較多,就是在spring的xml檔案中配置需要匯入的bean。在springweb專案工程web.xml中 ContextLoaderListener或者DispatcherServlet的初始引數contextConfigLocation指定spring配置檔案位置,可以在該配置檔案中直接定義bean,或者在該配置檔案中import專門配置三方bean的xml檔案。springboot工程,可以在啟動類上面加註解@ImportResource。@ImportResource註解可以通過value指定需要掃描的xml檔案,value是字串陣列可以指定多個xml配置檔案。

@SpringBootApplication
@ImportResource(value = {"classpath:spring-bean.xml"})
public class DubboOneApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(DubboOneApplication.class,args);
  }
}

2 @Configuration和@Bean

可以通過直接直接向spring容器注入bean。在開啟註解掃描的情況下,在掃描的包路徑中新增具有@Configuration註解的類,在該類的定義返回某個例項的方法,這個方法加上@Bean的註解,那麼這個方法的返回值將注入spring容器,這個bean的名稱是這個方法的名稱。

3 @Import

@Import可以直接向容器中匯入第三方包中bean。在開啟註解掃描的情況下,可以在有@Controller,@Service,@Component,@Repository,@Configuration註解的類上面新增@Import註解,@Import註解有一個類陣列型別的屬性,類陣列中的類有以下四種情況

普通的類名稱,該類被注入容器,bean名稱是全類名

@SpringBootApplication
@Import({TestTwo.class})
public class DubboOneApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(DubboOneApplication.class,args);
  }
}

具有Configuration作用的類,沒有@Configuration註解,裡面定義了具有@Bean註解的方法,例如上面TestTwo中有一個返回TestThree的方法使用了@Bean註解,那麼TestThree也會注入進容器,bean名稱就是方法名,和@Configuration注入功能類似。

ImportSelector實現類,該介面具有一個方法,方法的返回值是字串陣列,每一項是全類名,通過引數AnnotationMetadata可以得到這個被@Import註解修飾類的資訊。同樣這樣注入進來的bean的名稱也是全類名,可以返回空陣列,不可以返回null。第一種直接寫注入類名和使用ImportSelector實現類,都沒有辦法使用注入類的有參構造方法,bean的名稱也沒有辦法指定,不過只單例項自動注入,不用關心bean名稱。

public interface ImportSelector {
 
 /**
 * Select and return the names of which class(es) should be imported based on
 * the {@link AnnotationMetadata} of the importing @{@link Configuration} class.
 */
 String[] selectImports(AnnotationMetadata importingClassMetadata);
 
}

ImportBeanDefinitionRegistrar實現類,該類有個方法可以直接向Application中手動注入bean,我們可以簡單定義一個bean然後注入。

@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry) {
  RootBeanDefinition definition = new RootBeanDefinition(TestFive.class);
  registry.registerBeanDefinition("testTive",definition);
 }

4 @FactoryBean

FactoryBean可以用來實現代理,原始的代理實現就可以使用ProxyFactoryBean,還有專門用來實現事務代理的TransactionProxyFactoryBean。使用註解和配置的方式和一般bean一樣向容器中注入一個FactoryBean的實現類,實際注入的該FactoryBean中getObject方法返回的物件,這個bean的名稱還是對應配置或註解中指定的名稱。

@Component("testFive")
public class TestFour implements FactoryBean<TestFive>{
  @Override
  public boolean isSingleton() {
    return true;
  }
 
  @Override
  public TestFive getObject() throws Exception {
    return new TestFive();
  }
 
  @Override
  public Class<?> getObjectType() {
    return TestFive.class;
  }
}

補充知識:Spring Boot @Import註解(將指定類例項注入到IOC容器中)

[color=red][size=large][b]SpringBoot 的 @Import 用於將指定的類例項注入到Spring IOC Container中。[/b][/size][/color] SpringBoot 提供了 三種使用 @Import 將 類例項注入至 Spring IOC Container中 的例項。

1.直接注入

2.實現 ImportBeanDefinitionRegistrar 介面 注入

3.實現 ImportSelector 注入

[color=red][b]直接注入

[/b][/color]

Broker.java(無任何屬性和實現)

package com.springBoot.entrance.importBean.direct;
public class Broker {
}

Customer.java(無任何屬性和實現)

package com.springBoot.entrance.importBean.direct;
public class Customer {
}

ImportDirect.java

package com.springBoot.entrance.importBean.direct;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

@Component
@Import({Customer.class,Broker.class})
/**
 *使用Import 將指定的類的例項注入至Spring 容器中
 */
public class ImportDirect {

}

[b][color=red]程式碼解讀:使用 @Import({Customer.class,Broker.class}) 後 Customer 和 Broker類的例項將會被注入之Spring IOC Container中[/color][/b]

App.java

//import Direct 使用import 直接將指定的類例項注入至Spring 容器中
System.out.println(context.getBean(ImportDirect.class));
System.out.println(context.getBean(Customer.class));
System.out.println(context.getBean(Broker.class));

以上這篇基於spring三方包類注入容器的四種方式小結就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。