基于spring三方包类注入容器的四种方式小结

 更新时间:2020年09月27日 09:51:18   作者:luoanjuan  
这篇文章主要介绍了基于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三方包类注入容器的四种方式小结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot、Java 使用 Jsoup 解析 HTML 页面的详细步骤

    SpringBoot、Java 使用 Jsoup 解析 HTML 页面

    这篇文章主要介绍了SpringBoot、Java 使用 Jsoup 解析 HTML 页面的详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Java编程异常简单代码示例

    Java编程异常简单代码示例

    这篇文章主要介绍了Java编程异常简单代码示例,还是比较不错的,这里分享个大家,需要的朋友可以参考下。
    2017-11-11
  • Java实战之吃货联盟订餐系统

    Java实战之吃货联盟订餐系统

    这篇文章主要介绍了Java实战之吃货联盟订餐系统,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Java定时任务的三种实现方法

    Java定时任务的三种实现方法

    在应用里经常都有用到在后台跑定时任务的需求。举个例子,比如需要在服务后台跑一个定时任务来进行垃圾回收
    2014-04-04
  • spring cloud zuul增加header传输的操作

    spring cloud zuul增加header传输的操作

    这篇文章主要介绍了spring cloud zuul增加header传输的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot Actuator潜在的OOM问题的解决

    SpringBoot Actuator潜在的OOM问题的解决

    本文主要介绍了SpringBoot Actuator潜在的OOM问题的解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 实例详解Java实现图片与base64字符串之间的转换

    实例详解Java实现图片与base64字符串之间的转换

    这篇文章主要介绍了Java实现图片与base64字符串之间的转换实例代码,非常不错,具有参考借鉴价值,需要的朋友参考下
    2016-12-12
  • Java实现顺序表的增删查改功能

    Java实现顺序表的增删查改功能

    这篇文章主要介绍了Java实现顺序表的增删查改功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • java 多线程饥饿现象的问题解决方法

    java 多线程饥饿现象的问题解决方法

    这篇文章主要介绍了java 多线程饥饿现象的问题解决方法的相关资料,需要的朋友可以参考下
    2017-06-06
  • Spark使用IDEA编写wordcount的示例演示

    Spark使用IDEA编写wordcount的示例演示

    这篇文章主要介绍了Spark使用IDEA编写wordcount的示例演示,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论