精华内容
下载资源
问答
  • 主要介绍了Java的Spring框架中bean依赖注入,讲解了以构造函数为基础的依赖注入和基于setter方法的依赖注入的方式,需要的朋友可以参考下
  • 模块化划分的Spring或Spring Boot工程,如果遇到某个模块是工具模块等情况,其它模块可能就需要直接注入依赖模块的Bean。 Spring引用第三方jar包的Bean 假设第三jar包中采用的是XML配置文件(third-party-app...

    2018-10-23 某模型平台需要注入子模块的Bean

    前言

    模块化的Spring或Spring Boot工程,当遇到某个模块是基础工具模块或者模块间代码依赖较复杂的情况,其它模块就需要注入所依赖模块的Bean。

    Spring导入依赖的Bean

    假设第三jar包中采用的是XML配置文件(third-party-appContext.xml),则可直接使用如下方法导入依赖的Bean:

    <import resource="classpath:third-party-appContext.xml"/>
    

    为保证jar包的配置文件能被正确获取,在third-party-appContext.xml中配置好PropertyPlaceholderConfigurer的Bean即可。

    Spring Boot导入依赖的Bean

    Spring Boot与Spring在这个问题上的最大的区别是:Spring Boot对配置文件命名是有约束的,默认情况下它只会读取特定目录下名为application.properties的配置文件1。而Spring Boot本身会自动生成一个PropertyPlaceholderConfigurer的Bean去获取application.properties,所以如果在XML中配置该Bean是不会生效的。

    方法一:定义配置类覆盖PropertyPlaceholderConfigurer

    @Configuration
    public class PropertyConfigurer {
    	@Bean
    	public static PropertyPlaceholderConfigurer properties() {
    		final PropertyPlaceholderConfigurer conf = new PropertyPlaceholderConfigurer();
    		final List<Resource> resources = new ArrayList<>();
    		resources.add(new ClassPathResource("third-party-application.properties"));
    		conf.setLocations(resources.toArray(new Resource[]{}));
    		return conf;
    	}
    }
    

    方法二:定义PropertyPlaceholderConfigurer的Bean

    @Bean
    public class PropertyConfigurer extends PropertyPlaceholderConfigurer {
    	public PropertyConfigurer() {
    		this.setIgnoreResourceNotFound(true);
    		final List<Resource> resources = new ArrayList<>();
    		resources.add(new ClassPathResource("third-party-application.properties"));
    		this.setLocations(resources.toArray(new Resource[]{}));
    	}
    }
    

    方法三:使用@ConfigurationProperties

    详见Spring Boot文档

    方法四:命令行运行时使用spring.config.location环境属性指定特定的properties文件

    详见Spring Boot文档中Externalized Configuration相关内容

    潜在的坑

    • Jar包依赖没有添加到Pom,或者没有mvn install到本地环境
    • <context:property-placeholder/>和PropertyPlaceholderConfigurer的冲突问题
    • 始终无法获取properties文件的配置,请阅读参考阅读#2链接

    参考阅读


    1. Spring Boot读取外部配置 ↩︎

    展开全文
  • springboot Bean依赖注入

    千次阅读 2018-11-27 16:19:31
    通过new构造的对象依赖于springboot托管的对象时: 例如: 自己实现的缓存可能需要new来构造,但是依赖 RedisTemplate 来操作redis public class MyCahce&lt;K,V&gt; implements Cache&lt;K,V&gt;{ ...
    1. 通过new构造的对象依赖于springboot托管的对象时:
      例如:
      自己实现的缓存可能需要new来构造,但是依赖 RedisTemplate 来操作redis

      public class MyCahce<K,V> implements Cache<K,V>{
      	private RedisTemplate redisTemplate;
      }
      

      解决办法:

      @Component("mybeanfactory")
      public class MyBeanFactory implements ApplicationContextAware {
          protected static ApplicationContext context;
      @Override
      public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
          context = applicationContext;
      }
      
      public static Object getBean(String name)
      {
          return context.getBean(name);
      }
      }
      
      

      通过实现 ApplicationContextAware 接口保存上下文,通过静态方法来构建Bean,这需要将工厂类托管给spring才能拿到上下文,可能托管之前其他bean已经依赖于上面的Cache,这样就会报

      java.lang.NullPointerException: null
      

      对于这种问题需要想办法调整spring注入bean的顺序,网上说的 @Order 注解好像不太管用,可以使用 @DependsOn(“beanname”) 注解,要求当前bean必须要在“beanname”注解实例化之后才能实例化。

    展开全文
  • Spring Bean的4种依赖注入方式

    千次阅读 多人点赞 2020-07-24 15:44:09
    构造方法注入是指在构造方法中注入属性或者对象来实现依赖注入,如下所示,在标签中定义一个id为userDaoImpl的Bean,并通过注入了name为username,value为admin的值,注入完成后直接通过this.username获取到值admin...

    所谓依赖注入,其实就是给对象里的属性赋值,因为对象里有其他对象,因此就形成了依赖。Spring有4种方式来给属性赋值:

    1. 构造方法注入
    2. set方法注入
    3. 自动装配
    4. 注解
    

    1. 构造方法注入

    构造方法注入是指在构造方法中注入属性或者对象来实现依赖注入,如下所示,在标签中定义一个id为userDaoImpl的Bean,并通过注入了name为username,value为admin的值,注入完成后直接通过this.username获取到值admin。其中引用类型使用ref属性,基本类型使用value属性。

    public class UserDaoImpl {
    
        private String username;
    
        public UserDaoImpl(String username) {
            this.username = username;
        }
    }
    
      <bean id="userDaoImpl" class="com.example.UserDaoImpl">
          <constructor-arg name="username" value="admin"></constructor-arg>
      </bean>
    

    2. set方法注入

    set方法注入就是通过在类中实现get、set方法来实现属性或者对象的依赖注入,如下所示,在标签中定义一个id为userDaoImpl的Bean,并通过注入了name为username,value为admin的值,注入完成后直接通过getUsername()获取到值admin。

    public class UserDaoImpl {
    
        private String username;
    
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    }
    
        <bean id="userDaoImpl" class="com.example.UserDaoImpl">
            <property name="username" value="admin"></property>
        </bean>
    

    3. 自动装配

    Spring提供了自动装配的功能,简化了我们的配置,自动装配默认是不打开的,常用的方式有两种:

    • byName:通过参数名自动装配,如下所示,id为userService的的autowire被设置为byName后,IOC容器会通过名字来自动装配,发现UserService类中有个叫userDao的属性,然后看看IOC容器中有没有id为userDao的,如果有就装配进去。
        <bean id="userDao" class="com.example.UserDao"></bean>
        <bean id="userService" class="com.example.UserService" autowire="byName"/>
    
    • byType:通过参数类型自动装配,当autowire被设置为byType后,IOC容器会看看里面有没有UserDao类型的,有就装配进去。
        <bean id="userDao" class="com.example.UserDao"></bean>
        <bean id="userService" class="com.example.UserService" autowire="byType"/>
    

    4. 注解

    • @Autowired注解可以实现自动装配,只要在对应的属性上标记该注解,但是@Autowired注解只按照byType注入。

      public class UserController {
      
          @Autowired
          private IUserService userService;
      }
      
    • @Resource注解可以实现自动装配,它有两个重要属性name和type,name属性解析为bean的名字,type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

    • @Autowired注解和@Resource注解的作用相同,只不过@Autowired按照byType注入,如果@Autowired想使用名称可以结合@Qualifier注解进行使用

    展开全文
  • Spring之Bean依赖注入和自动装配

    千次阅读 2019-04-10 13:20:43
    Spring框架学习笔记_1概述:Spring BeanSpring依赖注入(DI)合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居...

    Spring之Bean、依赖注入和自动装配

    概述:

    此篇博客主要记录学习Spring时一些比较重要的知识点和遇到的坑。。。

    Spring Bean

    1. Bean定义
      Bean在我看来就是构成应用程序的支柱,是体现Spring IOC技术的重要标志。IOC简单来说就是将原始的通过new一个对象来实例化转换为交给Spring IOC容器来管理来获取实例化对象,而这些对象在Spring IOC容器中就是一个个Bean。
      我们可以通过以下方式在xml文件中简单配置一个Bean

       <bean id="myBean" class="Test.Bean"></bean>
      

      class属性是必须的,用来指定创建bean的全类名,可以通过id或者name来唯一标识这个bean。

      除此之外:
      scope属性:用来指定bean的作用域,在非Web项目下主要为singleton(默认值)和prototype两种属性,其中singleton表示在加载xml文件时便装载这个bean然后从始至终提供给你使用的都是同一个bean,而prototype则表示你每次请求一个bean时都重新装载一个全新的bean给你。

      autowire属性:表示在自动装载bean时依据什么标准,常用的主要是byName属性和byType属性,byName属性表示通过名字来自动装载bean,主要与setter方法配合使用,例如你有一个setMyBean()方法。
      那么通过以下配置便可以对Test.Bean类中的MyBean属性进行自动装载(id中第一个字母要小写

      <bean id="myBean" class="Test.Bean" autowire="byName"></bean>
      

      对于byType属性则是根据类型进行自动装载,如果Demo1类中有一个Demo2类的demo2属性,并且在xml文件中配置了Demo2类的bean,那么只需要在Demo1的bean中声明autowire为byType则可以对demo2进行自动装配

    Spring依赖注入(DI)

    1.基于构造函数
    基于构造函数的依赖注入一般引用与某个bean拥有带参数的构造方法。如果某个参数只是一个int,String,double之类的值,那么可以直接通过value来设置值,如果参数为另一个bean,则需要通过ref来设置。详情见代码
    假如有以下一个构造函数

    ```
    public Demo1(int x,Demo2 demo){
    	......
    }
    ```
    

    那么我们在xml文件中可以这样配置(可以与index或者type配合使用)

    <bean id="demo2" class="com.Test.Demo2"></bean>
    <bean id="demo1" class="com.Test.Demo1">
    	<constructor-arg value="1"/>
    	<constructor-arg ref="demo2"/>
    </bean>
    

    2.基于Set函数
    当容器调用一个无参的构造函数或者通过一个无参的静态factory方法来初始化bean的时候,外面就就可以通过基于set函数的依赖注入来对bean的属性进行设置,所以在bean对应的类中必须存在相应的set函数,与基于构造函数不同的地方就是通过property元素来进行配置。

    <bean name="demo" class="com.Test.Demo1">
    		//注意name用来指定要设置的属性名,首字母要小写
         <property name="name" value="huang"/>
    </bean>
    

    3.Spring注入集合
    如果在bean中某个属性为List、Set、Map等类型的,那么我们就可以在property标签内部使用list、set、map等标签取代value进行设置,例如我们要配置一个List属性的Items。

    <bean id="demo" class="com.Test.Demo">
    	<property name="items">
    		<list>
    			<value>item1</value>
                <value>item2</value>
                <value>item3</value>
                <value>item4</value>
    		</list>
    	</property>
    </bean>
    

    注意在list、set标签中,需要用value对每个值进行设置,而map标签则需要用entry分别设置键key和值value

    展开全文
  • SpringBoot基础篇Bean动态注册

    万次阅读 2018-10-21 19:33:01
    Spring中的Bean除了前面提到的几种JavaConfig或者@Component等注解标识之外,也是可以动态的向Spring容器注册的,本篇博文将主要介绍 如何向Spring容器注册Bean 如何引用主动注册Bean 注册Bean中,如果依赖其他...
  • Spring中的依赖注入Bean的配置

    千次阅读 2020-04-06 17:31:43
    目录前言如何配置一个Bean如何获取Bean属性注入构造方法注入属性注入细节处理特殊字符引入其他Bean注入集合类型Properties注入 前言 我们前面讲过如何创建第一个Spring程序,也简单的接触了一下Spring中的依赖注入。...
  • Spring-注入依赖,AOP,自动注入Bean。入门。为什么没有0积分?
  • Springmvc bean依赖注入为空

    千次阅读 2017-11-08 20:25:57
    在使用spring+springMVC框架开发经常会遇到依赖注入为空的情况 在此记录下会发生依赖注入为空的情况: 注解方式不对,@Controller(”) @Service @Repository @Resource这些注解如果有别名就在括号中写明,然后再...
  • spring bean依赖注入过程

    千次阅读 2019-01-15 18:05:00
    通过看spring IOC模块的源码, 可以了解到容器获取bean的核心方法是实现了BeanFactory接口的一个抽象AbstractBeanFactory中 ,核心方法是doGetBean 1 /** 2 * Return an instance, which may be shared or ...
  • 上一篇 IOC容器从BeanFactory获取Bean源码浅析中,实例化bean到IOC容器中,是通过默认无参构造器来实例化的,没有涉及到Bean依赖注入问题。现补上。 bean依赖注入过程,首先实例化,可以通过构造器实例化,也可以...
  • JAVA简单AOP切面编程;依赖注入;代码配置Bean源码 JAVA简单AOP切面编程;依赖注入;代码配置Bean源码
  • Bean 的三种依赖注入方式介绍

    万次阅读 2018-08-20 16:17:46
    依赖注入:让调用类对某一接口实现类的依赖关系由第三方注入,以移除调用类对某一接口实现类的依赖。...属性注入即通过setXXX()方法注入Bean的属性值或者依赖对象,由于属性注入方式具有可选择性和灵活高的优...
  • 依赖注入Bean的实例化

    千次阅读 2016-03-12 12:47:21
    上一篇分析到了通过递归的方式获取Bean的所有依赖,接下来就该实例化Bean了...依赖注入的起点是getBean方法,然后会调用createBean方法来实现这个过程。 进入createBean方法 resolveBeanClass方法判断需要创建的
  • Spring中的依赖注入的三种方法 基于构造方法 setter注入(常用) 接口注入(不常用) Bean如下 package spring; public class Role { private Long id; private String roleName; private String n...
  • 最近在做项目时候遇到一个奇葩问题,就是bean依赖注入的正确性与bean直接注入的顺序有关系,但是正常情况下明明是和顺序没关系的啊,究竟啥情况那,不急,让我一一道来。 二、普通Bean循环依赖-与注入顺序无关 ...
  • Spring 手动注册bean

    千次阅读 2020-05-02 22:31:14
    一般情况下,我们Spring应用中的bean都是通过注解或者xml注入到容器中的,有些情况下我们可能想手动往容器中注入bean,即编程方式注入bean。 本文所使用源码包版本:spring-beans-5.0.5.RELEASE. 如何注册? ...
  • 一直对spring容器中注入依赖有一个疑问:当Abean有一个属性Bbean,即Abean对Bbean有依赖,那么容器是怎么保证Bbean在Abean之前加载呢? 在说这个问题答案之前,我先抛出一个问题,什么是bean的实例化,什么是bean的...
  • 二、@Autowired:自动装配 自动装配,用于替代基于XML配置的自动装配 基于@Autowired的自动装配,默认是根据...@Autowired默认是根据参数类型进行自动装配,且必须有一个Bean候选者注入, 如果允许出现0个Bean候选者需
  • * 注册过滤器-保证正确的类被扫描注入 */ protected void registerFilters() { addIncludeFilter(new TypeFilter() { @Override public boolean match(MetadataReader metadataReader, MetadataReaderFactory ...
  • spring boot 学习(三) — 依赖注入 @Bean

    万次阅读 2017-03-29 21:10:58
    spring 4推荐的@Configuration 和@bean 的用法,这样我们可以省去繁琐的配置文件 第一步 建一个Maven工程 第二部添加依赖 pom.xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins
  • 1. 构造函数参数依赖的例子 @Component public class BeanA { // 省略实现 // ......} @Component ... // 注意,这里可以不使用 @AutoWired 等注解就会导致Spring的依赖注入 public BeanB(BeanA a) {...
  • 在阅读Spring Boot源码时,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar来实现Bean动态注入。它是Spring中一个强大的扩展接口。本篇文章来讲讲它相关使用。 Spring Boot中的使用 在Spring Boot 内置...
  • 作用:@Autowired表示被修饰的类需要注入对象,spring会扫描所有被@Autowired标注的类,然后根据 类型 在ioc容器中找到匹配的类注入。 示例代码: Java代码 收藏代码 @Autowired public class Car(...
  • Spring中bean注入方式

    万次阅读 多人点赞 2019-04-15 10:51:35
    Spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过Spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。 依赖注入的另一种说法是”控制反转”。通俗的理解是:平常我们new一个实例,这个...
  • 1) IOC依赖注入工作流程(1)Spring 容器高层视图:三种配置bean的方式 (2)完整Bean的作业流程:通过配置文件,最后生成bean实例 2) 三种配置注入bean方式—示例:三种方式、区别和使用场景(1)基于XML的配置...
  • spring中bean注入的四种方式

    千次阅读 2020-05-12 15:32:58
      最近在复习Spring的相关内容,这篇博客就来记录一下Spring为bean的属性注入值的四种方式。这篇博客主要讲解在xml文件中,如何为bean的属性注入值,最后也会简单提一下使用注解的方式。废话不多说,直接开始吧。 ...
  • Spring中动态注入Bean实例

    千次阅读 2019-07-14 15:06:46
    本文将介绍一种在实际项目中基于动态的方式来提取Spring管理的Bean。 下面话不多说了,来一起看看详细的介绍吧。 一、基于标注的方式注入实例 需要在Bean初始化之时,其依赖的对象必须初始化完毕。如果被注入的...
  • java bean注入之静态注入

    千次阅读 2018-02-13 15:19:04
    标签的写入、java中的@configuration、@bean、@autowrite注解等信息,将相关的java bean的信息注册在容器的注册表中。之后Spring容器会根据注册表的信息将注册表中的bean类进行实例化,并将实例化...
  • spring bean注册注入覆盖

    千次阅读 2019-02-15 10:59:44
    //存储注册的俄BeanDefinition  private final Map&lt;String, BeanDefinition&gt; beanDefinitionMap = new ConcurrentHashMap&lt;String, BeanDefinition&gt;();  //向IoC容器注册解析的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 165,058
精华内容 66,023
关键字:

动态注册bean注入依赖