精华内容
下载资源
问答
  • 2020-04-10 08:44:09

    Spring 注入static属性值

    本文介绍Spring中如何从属性文件给static字段注入值。实际应用中一些工具类中static属性值需读取配置文件,实现该功能可以让工具类提供静态方法更易使用。

    1. 问题

    首先在属性文件中定义属性:

    name = Inject a value to a static field
    

    然后给实例变量注入值,通常在字段上使用@Value注解:

    @Value("${name}")
    private String name;
    

    但在static字段上应用是,会发现其值为null,注入失败:

    @Value("${name}")
    private static String NAME_NULL;
    

    这是因为Spring不支持在static字段上使用@Value注解。

    2. 解决方案

    Spring @Value注解可以在方法上使用,在加载所有Spring配置和bean后,Spring上下文将调用它。方法有多个参数,那么每个参数值都为方法注解对应的值,如果需要参数获取不同的值,可以在参数上增加注解:

    @Value("Test")
    public void printValues(String s, String v){} //both 's' and 'v' values will be 'Test' 
    
    @Value("Test")
    public void printValues(String s, @Value("Data") String v){}
    // s=Test, v=Data
    

    有了上面的知识,我们可以修改代码为:

    public class PropertyUtils {
     
        @Value("${name1}")
        private String name;
     
        private static String NAME_STATIC;
     
        @Value("${name2}")
        public void setNameStatic(String name){
            PropertyController.NAME_STATIC = name;
        }
    }
    

    这回通过方法成功给static变量NAME_STATIC赋值。

    3. 总结

    文本介绍了Spring如何从属性文件给static属性注入值,在写一些与配置相关的工具类时常用。

    更多相关内容
  • 主要介绍了Spring不能注入Static变量的原因及Spring注入静态变量,需要的朋友可以参考下
  • Spring 注入 Bean 的七种方式

    千次阅读 2021-09-01 00:05:40
    来源:juejin.cn/post/6844903813753602056通过注解注入Bean背景我们谈到Spring的时候一定会提到IOC容器、DI依赖注入Spring通过将一个个类标...

    来源:juejin.cn/post/6844903813753602056

    通过注解注入Bean

    背景

    我们谈到Spring的时候一定会提到IOC容器、DI依赖注入,Spring通过将一个个类标注为Bean的方法注入到IOC容器中,达到了控制反转的效果。那么我们刚开始接触Bean的时候,一定是使用xml文件,一个一个的注入,就例如下面这样。

     <bean id="bean" class="beandemo.Bean" />
    
    

    我们的项目一般很大的话,就需要成千上百个Bean去使用,这样写起来就很繁琐。那么Spring就帮我们实现了一种通过注解来实现注入的方法。只需要在你需要注入的类前面加上相应的注解,Spring就会帮助我们扫描到他们去实现注入。

    xml扫描包的方式

     <context:component-scan base-package="com.company.beandemo"/>
    
    

    通过注解注入的一般形式

    一般情况下,注入Bean有一个最直白,最易懂的方式去实现注入,下面废话先不多说,先贴代码。

    Bean类

    public class MyBean{
    }
    
    

    Configuration类

    //创建一个class配置文件
    @Configuration
    public class MyConfiguration{
     //将一个Bean交由Spring进行管理
        @Bean
        public MyBean myBean(){
            return new MyBean();
        }
    }
    
    

    Test类

    与xml有一点不同,这里在Test中,实例化的不再是ClassPathXmlApplicationContext,而是获取的AnnotationConfigApplicationContext实例。

    ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
    MyBean myBean = cotext.getBean("myBean",MyBean.class);
    System.out.println("myBean = " + myBean);
    
    

    上面的代码中MyBean也就是我们需要Spring去管理的一个Bean,他只是一个简单的类。而MyConfiguration中,我们首先用@Configuration注解去标记了该类,这样标明该类是一个Spring的一个配置类,在加载配置的时候会去加载他。

    在MyConfiguration中我们可以看到有一个方法返回的是一个MyBean的实例,并且该方法上标注着@Bean的注解,标明这是一个注入Bean的方法,会将下面的返回的Bean注入IOC。

    通过构造方法注入Bean

    我们在生成一个Bean实例的时候,可以使用Bean的构造方法将Bean实现注入。直接看代码

    Bean类

    @Component
    public class MyBeanConstructor {
    
     private AnotherBean anotherBeanConstructor;
    
     @Autowired
     public MyBeanConstructor(AnotherBean anotherBeanConstructor){
         this.anotherBeanConstructor = anotherBeanConstructor;
     }
    
     @Override
     public String toString() {
         return "MyBean{" +
             "anotherBeanConstructor=" + anotherBeanConstructor +
             '}';
     }
    }
    
    

    AnotherBean类

    @Component(value="Bean的id,默认为类名小驼峰")
    public class AnotherBean {
    }
    
    

    Configuration类

    @Configuration
    @ComponentScan("com.company.annotationbean")
    public class MyConfiguration{
    }
    
    

    这里我们可以发现,和一般方式注入的代码不一样了,我们来看看新的注解都是什么意思:

    @AutoWired

    简单粗暴,直接翻译过来的意思就是自动装配:wrench:,还不理解为什么叫自动装配:wrench:?看了下一个注解的解释你就知道了。若是在这里注入的时候指定一个Bean的id就要使用@Qualifier注解

    @Component(默认单例模式)

    什么??这翻译过来是零件,怎么感觉像是修汽车??是的,Spring管理Bean的方法就是修汽车的方式。我们在需要将一个类变成一个Bean被Spring可以注入的时候加上注解零件@Conmonent,那么我们就可以在加载Bean的时候把他像零件一样装配:wrench:到这个IOC汽车上了

    在这里我们还有几个其他的注解也可以实现这个功能,也就是细化的@Component

    • @Controller 标注在Controller层

    • @Service 标注在Service层

    • @Repository 标注在dao层

    @ComponentScan("")

    还是翻译,零件扫描,我们去看看括号里的“零件仓库”里面,哪些“零件”(类)需要被装载,Spring就会去扫描这个包,将里面所有标注了@Component的类进行注入。

    这里的通过构造方法进行注入就很好理解了,我们在装配MyBean这个零件的时候,突然发现他必须在AnotherBean的基础上才能安装到IOC里面,那么我们就在每次装配MyBean的时候自动装配:wrench:一个AnotherBean进去。举个:chestnut:吧:

    还是以汽车为例,我们在踩油门出发之前,是不是必须发车??这里的AutoWired的内容就像发车,你不发车,这个油门你踩断都没有用,他都不会走。

    通过set方法注入Bean

    我们可以在一个属性的set方法中去将Bean实现注入,看代码吧

    MyBean类

    @Component
    public class MyBeanSet {
    
     private AnotherBean anotherBeanSet;
    
     @Autowired
     public void setAnotherBeanSet(AnotherBean anotherBeanSet) {
         this.anotherBeanSet = anotherBeanSet;
     }
    
     @Override
     public String toString() {
         return "MyBeanSet{" +
             "anotherBeanSet=" + anotherBeanSet +
             '}';
     }
    }
    
    

    Configuration类 和 Test类

    同上一个,就不贴了

    这里我们发现在setter方法上我们有一个@AutoWired,与上面不同的是,我们不会在实例化该类时就自动装配:wrench:这个对象,而是在显式调用setter的时候去装配。

    通过属性去注入Bean

    我们前面两种注入的方式诸如时间不同,并且代码较多,若是通过属性,即就是

    @Component
    public class MyBeanProperty {
    
     @Autowired
     private AnotherBean anotherBeanProperty;
    
     @Override
     public String toString() {
         return "MyBeanProperty{" +
             "anotherBeanProperty=" + anotherBeanProperty +
             '}';
     }
    }
    
    

    这里我们可以看到我们这个类中需要使用AnotherBean这个实例对象,我们可以通过@AutoWired去自动装配它。

    对于有些小伙伴问私有属性,Spring怎么去加载它到IOC的?推荐去看看反射

    通过List注入Bean

    MyBeanList类

    @Component
    public class MyBeanList {
    
     private List<String> stringList;
    
     @Autowired
     public void setStringList(List<String> stringList) {
         this.stringList = stringList;
     }
    
     public List<String> getStringList() {
         return stringList;
     }
    }
    
    

    MyConfiguration类

    @Configuration
    @ComponentScan("annoBean.annotationbean")
    public class MyConfiguration {
    
        @Bean
        public List<String> stringList(){
           List<String> stringList = new ArrayList<String>();
           stringList.add("List-1");
           stringList.add("List-2");
           return stringList;
        }
    }
    
    

    这里我们将MyBeanList进行了注入,对List中的元素会逐一注入。下面介绍另一种方式注入List

    MyConfiguration类

    @Bean
    //通过该注解设定Bean注入的优先级,不一定连续数字
    @Order(34)
    public String string1(){
        return "String-1";
    }
    
    @Bean
    @Order(14)
    public String string2(){
        return "String-2";
    }
    
    

    注入与List中泛型一样的类型,会自动去匹配类型,及时这里没有任何List的感觉,只是String的类型,但他会去通过List的Bean的方式去注入。

    第二种方式的优先级高于第一种,当两个都存在的时候,若要强制去使用第一种方式,则要去指定Bean的id即可

    通过Map去注入Bean

    @Component
    public class MyBeanMap {
    
     private Map<String,Integer> integerMap;
    
     public Map<String, Integer> getIntegerMap() {
         return integerMap;
     }
    
     @Autowired
     public void setIntegerMap(Map<String, Integer> integerMap) {
         this.integerMap = integerMap;
     }
    }
    
    
    @Bean
    public Map<String,Integer> integerMap(){
        Map<String,Integer> integerMap = new HashMap<String, Integer>();
        integerMap.put("map-1",1);
        integerMap.put("map-2",2);
        return integerMap;
    }
    
    @Bean
    public Integer integer1(){
        return 1;
    }
    
    @Bean
    public Integer integer2(){
        return 2;
    }
    
    

    同样这里也具有两种方式去注入Map类型Bean,且第二种的优先值高于第一种

    以上就是Bean通过注解注入的几种方式,大家可以对比着xml注入的方式去看。

    逆锋起笔是一个专注于程序员圈子的技术平台,你可以收获最新技术动态最新内测资格BAT等大厂大佬的经验增长自身学习资料职业路线赚钱思维,微信搜索逆锋起笔关注!

    往期回顾

    Spring Boot 项目瘦身指南!

    IntelliJ IDEA 2021.2 正式发布

    SpringBoot 实现登录拦截器(实战版)

    Java 框架 Mybatis 插件开发指南,超详细!

    Spring Boot 这样优化,让你的项目飞起来!

    展开全文
  • 如何正确使用 Spring 注入集合类型?

    千次阅读 多人点赞 2021-09-12 17:53:55
    集合类型的自动注入Spring提供的另外一个强大功能。我们在方便的使用依赖注入的特性时,必须要思考对象从哪里注入、怎么创建、为什么是注入这一个对象的。虽然编写框架的目的是让开发人员无需关心太多底层细节,能...

    集合类型的自动注入是Spring提供的另外一个强大功能。我们在方便的使用依赖注入的特性时,必须要思考对象从哪里注入、怎么创建、为什么是注入这一个对象的。虽然编写框架的目的是让开发人员无需关心太多底层细节,能专心业务逻辑的开发,但是作为开发人员不能真的无脑去使用框架。
    务必学会注入集合等高级用法,让自己有所提升!

    现在有一需求:存在多个用户Bean,找出来存储到一个List。

    1 注入方式

    1.1 收集方式

    多个用户Bean定义:

    有了集合类型的自动注入后,即可收集零散的用户Bean:

    这样即可完成集合类型注入:

    但当持续增加一些user时,可能就不喜欢用上述的注入集合类型了,而是这样:

    1.2 直接装配方式


    分开玩,大家应该不会有啥问题,若两种方式共存了,会咋样?
    运行程序后发现直接装配方式的未生效:

    这是为啥呢?

    2 源码解析

    就得精通这两种注入风格在Spring分别如何实现的。

    2.1 收集装配

    DefaultListableBeanFactory#resolveMultipleBeans

    private Object resolveMultipleBeans(DependencyDescriptor descriptor, @Nullable String beanName,
          @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) {
       final Class<?> type = descriptor.getDependencyType();
       if (descriptor instanceof StreamDependencyDescriptor) {
          // 装配stream
          return stream;
       }
       else if (type.isArray()) {
          // 装配数组
          return result;
       }
       else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {
          // 装配集合
          // 获取集合的元素类型
          Class<?> elementType = descriptor.getResolvableType().asCollection().resolveGeneric();
          if (elementType == null) {
             return null;
          }
          // 根据元素类型查找所有的bean
          Map<String, Object> matchingBeans = findAutowireCandidates(beanName, elementType,
                new MultiElementDescriptor(descriptor));
          if (matchingBeans.isEmpty()) {
             return null;
          }
          if (autowiredBeanNames != null) {
             autowiredBeanNames.addAll(matchingBeans.keySet());
          }
          // 转化查到的所有bean放置到集合并返回
          TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
          Object result = converter.convertIfNecessary(matchingBeans.values(), type);
          // ...
          return result;
       }
       else if (Map.class == type) {
          // 解析map
          return matchingBeans;
       }
       else {
          return null;
       }
    }
    

    1 获取集合类型的elementType

    目标类型定义为List users,所以元素类型为User:

    2 根据元素类型找出所有Bean

    有了elementType,即可据其找出所有Bean:

    3 将匹配的所有的Bean按目标类型转化

    上一步获取的所有的Bean都以java.util.LinkedHashMap.LinkedValues存储,和目标类型大不相同,所以最后按需转化。

    本案例中,需转化为List:

    2.2 直接装配方式

    DefaultListableBeanFactory#findAutowireCandidates

    不再赘述。

    最后就是根据目标类型直接寻找匹配Bean名称为users的List<user>装配给userController#users属性。

    当同时满足这两种装配方式时,Spring会如何处理呢?

    DefaultListableBeanFactory#doResolveDependency


    显然这两种装配集合的方式不能同存,结合本案例:

    • 当使用收集装配时,能找到任一对应Bean,则返回
    • 若一个都没找到,才采用直接装配

    所以后期以List方式直接添加的user Bean都不生效!

    3 修正

    务必避免两种方式共存去装配集合!只选用一种方式即可。
    比如只使用直接装配:
    只使用收集方式:

    如何做到让用户2优先输出呢?
    控制spring bean加载顺序:

    1. Bean上使用@Order注解,如@Order(2)。数值越小表示优先级越高。默认优先级最低。
    2. @DependsOn 使用它,可使得依赖的Bean如果未被初始化会被优先初始化。
    3. 添加@Order(number)注解,number越小优先级越高,越靠前
    4. 声明user这些Bean时将id=2的user提到id=1之前
    展开全文
  • spring注入map,spring注入多个实现类在map里 一个接口,两个实现类 接口: public interface TestService { void test(); } 两个实现类 @Component("testOService") public class TestOService implements ...

    spring注入map,spring注入多个实现类在map里

    一个接口,两个实现类

    接口:

     

    public interface TestService {
        void test();
    }

     

    两个实现类

    @Component("testOService")
    public class TestOService implements TestService {
        @Override
        public void test() {
            System.out.println("testOService");
        }
    }

     

    @Component("testTwoService")
    public class TestTwoService implements TestService {
        @Override
        public void test() {
            System.out.println("testTwoService");
        }
    }

     

    查看:

    @Service
    public class UserInfoService {
        
        @Autowired
        private Map<String ,TestService> testServiceMap;
        @PostConstruct
        public void init(){
            testServiceMap.get("testOService").test();
            testServiceMap.get("testTwoService").test();
        }
    }

     

     

    展开全文
  • Spring注入方式及优缺点

    千次阅读 2020-09-12 15:46:45
    Spring注入方式 Spring依赖注入的方式有:构造器注入,setter方法注入、属性注入、工厂方法注入,官方3.x版本推荐使用setter方法注入,到4.x之后官方推荐使用构造器注入。 1、构造器注入 通过构造器注入Shop这个Bean...
  • Spring注入集合(数组、List、Map、Set)类型属性

    千次阅读 多人点赞 2021-01-16 13:30:48
    目录注入集合(数组、List、Map、Set)类型属性把集合注入部分提取出来 注入集合(数组、List、Map、Set)类型属性 (1)创建类,定义数组,list,map,set类型属性,并且生成对应的set方法。 (2)在spring配置文件中...
  • 多线程Spring注入对象问题的四种解法 前言 当我们使用多线程时,想给线程注入一个service,但是运行时发现service总是为null。举个????: public class MyThread implements Runnable { @Autowired Service ...
  • ![图片说明](https://img-ask.csdn.net/upload/201912/24/1577157689_384511.png) ++++++++++ ![图片说明]... ++++++++++ ...spring只能注入实现类吗? 还是我有什么地方写错了呢? 请大神指教,谢谢。
  • @Configuration注解所注释的配置类可通过构造函数注入ApplicationContext 代码: public interface AA { int f(); } public class BB implements AA { @Override public int f() { return 6; } } @C...
  • 在学习spring的时候有个很重的知识点,那就是注入,不同的注入方式为程序的运行效率,资源利用都有不同的好处,接下来就看看我通过看视频总结的注入,这里的注入不是依赖注入等知识,只是最简单的,依赖注入,反转...
  • spring注入的三种方式是什么

    千次阅读 2021-02-28 12:25:56
    spring注入的三种方式是:1、构造器注入;2、setter注入;3、接口注入。构造器注入依赖于构造方法的实现,setter注入是通过setter方法注入。spring的依赖注入分为三种方式,如下:1、构造器注入2、setter注入3、接口...
  • spring注入数组

    千次阅读 2018-06-11 10:38:48
    【例】spring注入数组类型创建User类package com.shw; public class User { private String []username; public String[] getUsername() { return username; } public void setUsername(String[] username) { ...
  • Spring 注入 Bean 到 List / Map 中

    千次阅读 2020-01-15 01:12:50
    * spring会自动将 DemoService 的所有实现类bean注入到list集合 */ @Autowired private List<DemoService> demoServices; /* * 通过Map注入,通过 spring bean 的名称作为key动态获取对应实例 */ @Aut.....
  • spring注入List集合

    万次阅读 2018-06-11 10:55:52
    【例】spring注入List集合创建User类package com.shw; public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername...
  • Spring往容器中注入组件四种方式: 1. 包扫描(@ComponentScan+@Controller,@Service,@Component,@Repository) 开发中经常使用。 2. 配置类 @Configuration + @Bean方式 一般用导入第三方的组件 3. 使用@Import...
  • spring注入Map集合

    万次阅读 2018-06-11 11:10:59
    【例】spring注入Map集合创建User类package com.shw; public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername...
  • spring注入为null原因及解决方案

    千次阅读 2019-08-20 14:34:39
    在使用Aviator时需要自定义函数,但是在使用自定函数的时候发现@Resource注入的类是null,使用的框架是springboot所以没什么好配置的,在网上找了下原因,找到其中一个“在spring中如果使用new创建一个对象时,这个...
  • Spring注入List/Map

    千次阅读 2018-06-12 16:24:20
    Spring注入List/Map XML方式 之前一直使用xml的方式进行Spring配置,对于内部元素为String的List和Map属性的注入一般为如下方式: &lt;bean id = "testBean" class = "...
  • Spring注入方式

    千次阅读 2017-12-15 14:23:41
    整理的spring注入方式
  • Spring注入空指针问题

    千次阅读 2019-04-24 14:45:25
    最近建项目的时候在使用bean的时候五一中使用了static关键字修饰注入的bean: @Autowired private static ClassName fieldName; 必须马上纠正一下,正确的写法: @Autowired private ClassName fieldName;  &...
  • Spring注入Bean的几种方式

    万次阅读 多人点赞 2019-04-06 03:18:13
    我们谈到Spring的时候一定会提到IOC容器、DI依赖注入Spring通过将一个个类标注为Bean的方法注入到IOC容器中,达到了控制反转的效果。那么我们刚开始接触Bean的时候,一定是使用xml文件,一个一个的注入,就例如...
  • MapStruct文档(三)——Spring注入

    千次阅读 2020-12-09 15:38:14
    通常我们的项目都是基于spring的,对象的注入就必不可少。 在pom文件的bulid->plugins->plugin(maven-compiler-plugin)->configuration下添加相应配置。mapstruct配置 ... <plugin> <groupId...
  • junit单元测试时通过spring注入

    千次阅读 2019-08-22 15:43:27
    @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest @WebAppConfiguration ssm: 测试类的名字上添加注解: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:bean....
  • Spring注入对象数组

    千次阅读 2017-12-25 23:47:15
    今天在研究spring属性编辑器,注册spring自带编辑器时,...spring源码如下: 注册方式<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="propertyEditorRegistrars">
  • 问题 为什么xxxController注入的是xxxService,而不是xxxServiceImpl?...@Autowired的对象是通过接口的话,Spring默认会使用jdk动态代理,jdk动态代理只能对实现了接口的类生成代理,而不能针对类,而且还可以对实现类
  • Spring注入bean 为null的相关问题

    千次阅读 2019-08-22 15:00:37
    Spring注入bean 为null的相关问题 问题描述 有一个类注入 发现里面的MongoLogInfoDAO始终为null @Component("countFunction") public class CountFunction implements AviatorFunction { @Resource(name = ...
  • Spring 注入 statistic final

    千次阅读 2018-06-22 16:15:58
    问题背景1、在spring配置中有一个【在线地址】的配置 2、有一个工具类,可以读取spring的配置 需求:将spring的配置定义为一个... 思路:先定义一个类,通过setter注入的方式获取spring中的配置信息,并将其定...
  • spring不能注入static变量的原因: Spring 依赖注入 是依赖 set方法 set方法是 是普通的对象方法 static变量是类的属性 所以下面这种方式注入静态的变量是会报空指针异常的。 spring 中如何注入静态变量:...
  • spring注入失败分析

    千次阅读 2018-06-06 11:21:50
    问题阐述: 自动注入以实现类方式注入,启动报错: nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 443,839
精华内容 177,535
关键字:

Spring注入