基于spring三方包類注入容器的四種方式小結(jié)
如果引用第三方j(luò)ar包,肯定是不能直接使用常用注解@Controller、@Service、@Repository、@Component將類的實(shí)例注入到spring容器中。以下四種方法可以向spring容器中導(dǎo)入三方包中類實(shí)例 。
1 xml配置
這種情況大家用的比較多,就是在spring的xml文件中配置需要導(dǎo)入的bean。在springweb項(xiàng)目工程web.xml中 ContextLoaderListener或者DispatcherServlet的初始參數(shù)contextConfigLocation指定spring配置文件位置,可以在該配置文件中直接定義bean,或者在該配置文件中import專門配置三方bean的xml文件。springboot工程,可以在啟動(dòng)類上面加注解@ImportResource。@ImportResource注解可以通過value指定需要掃描的xml文件,value是字符串?dāng)?shù)組可以指定多個(gè)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注解的類,在該類的定義返回某個(gè)實(shí)例的方法,這個(gè)方法加上@Bean的注解,那么這個(gè)方法的返回值將注入spring容器,這個(gè)bean的名稱是這個(gè)方法的名稱。
3 @Import
@Import可以直接向容器中導(dǎo)入第三方包中bean。在開啟注解掃描的情況下,可以在有@Controller,@Service,@Component,@Repository,@Configuration注解的類上面添加@Import注解,@Import注解有一個(gè)類數(shù)組類型的屬性,類數(shù)組中的類有以下四種情況
普通的類名稱,該類被注入容器,bean名稱是全類名
@SpringBootApplication @Import({TestTwo.class}) public class DubboOneApplication { public static void main(String[] args) { SpringApplication.run(DubboOneApplication.class, args); } }
具有Configuration作用的類,沒有@Configuration注解,里面定義了具有@Bean注解的方法,例如上面TestTwo中有一個(gè)返回TestThree的方法使用了@Bean注解,那么TestThree也會(huì)注入進(jìn)容器,bean名稱就是方法名,和@Configuration注入功能類似。
ImportSelector實(shí)現(xiàn)類,該接口具有一個(gè)方法,方法的返回值是字符串?dāng)?shù)組,每一項(xiàng)是全類名,通過參數(shù)AnnotationMetadata可以得到這個(gè)被@Import注解修飾類的信息。同樣這樣注入進(jìn)來的bean的名稱也是全類名,可以返回空數(shù)組,不可以返回null。第一種直接寫注入類名和使用ImportSelector實(shí)現(xiàn)類,都沒有辦法使用注入類的有參構(gòu)造方法,bean的名稱也沒有辦法指定,不過只單實(shí)例自動(dòng)注入,不用關(guān)心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實(shí)現(xiàn)類,該類有個(gè)方法可以直接向Application中手動(dòng)注入bean,我們可以簡單定義一個(gè)bean然后注入。
@Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { RootBeanDefinition definition = new RootBeanDefinition(TestFive.class); registry.registerBeanDefinition("testTive",definition); }
4 @FactoryBean
FactoryBean可以用來實(shí)現(xiàn)代理,原始的代理實(shí)現(xiàn)就可以使用ProxyFactoryBean,還有專門用來實(shí)現(xiàn)事務(wù)代理的TransactionProxyFactoryBean。使用注解和配置的方式和一般bean一樣向容器中注入一個(gè)FactoryBean的實(shí)現(xiàn)類,實(shí)際注入的該FactoryBean中g(shù)etObject方法返回的對象,這個(gè)bean的名稱還是對應(yīng)配置或注解中指定的名稱。
@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; } }
補(bǔ)充知識(shí):Spring Boot @Import注解(將指定類實(shí)例注入到IOC容器中)
[color=red][size=large][b]SpringBoot 的 @Import 用于將指定的類實(shí)例注入到Spring IOC Container中。[/b][/size][/color] SpringBoot 提供了 三種使用 @Import 將 類實(shí)例注入至 Spring IOC Container中 的實(shí)例。
1.直接注入
2.實(shí)現(xiàn) ImportBeanDefinitionRegistrar 接口 注入
3.實(shí)現(xiàn) ImportSelector 注入
[color=red][b]直接注入
[/b][/color]
Broker.java(無任何屬性和實(shí)現(xiàn))
package com.springBoot.entrance.importBean.direct; public class Broker { }
Customer.java(無任何屬性和實(shí)現(xiàn))
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 將指定的類的實(shí)例注入至Spring 容器中 */ public class ImportDirect { }
[b][color=red]代碼解讀:使用 @Import({Customer.class,Broker.class}) 后 Customer 和 Broker類的實(shí)例將會(huì)被注入之Spring IOC Container中[/color][/b]
App.java
//import Direct 使用import 直接將指定的類實(shí)例注入至Spring 容器中 System.out.println(context.getBean(ImportDirect.class)); System.out.println(context.getBean(Customer.class)); System.out.println(context.getBean(Broker.class));
以上這篇基于spring三方包類注入容器的四種方式小結(jié)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot、Java 使用 Jsoup 解析 HTML 頁面
這篇文章主要介紹了SpringBoot、Java 使用 Jsoup 解析 HTML 頁面的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08Java實(shí)戰(zhàn)之吃貨聯(lián)盟訂餐系統(tǒng)
這篇文章主要介紹了Java實(shí)戰(zhàn)之吃貨聯(lián)盟訂餐系統(tǒng),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Java定時(shí)任務(wù)的三種實(shí)現(xiàn)方法
在應(yīng)用里經(jīng)常都有用到在后臺(tái)跑定時(shí)任務(wù)的需求。舉個(gè)例子,比如需要在服務(wù)后臺(tái)跑一個(gè)定時(shí)任務(wù)來進(jìn)行垃圾回收2014-04-04

SpringBoot Actuator潛在的OOM問題的解決

實(shí)例詳解Java實(shí)現(xiàn)圖片與base64字符串之間的轉(zhuǎn)換