浅谈@Value和@Bean的执行顺序问题

作者:qq_27397913 时间:2023-02-25 18:30:24 

问题描述

使用@Autowired处理多个同种类型的bean,出现@Value和@Bean的执行顺序问题。

首先使用扫描包+注解的方式注册User类型的不同bean,分别是user、user1,注册方式如下


package com.fanyinhang.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author fanyinhang
* @version 1.0
* @create 2019/10/8-19:11
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Component
public class User {
   private Integer id;
   private String name;
}

该方式得到User类型的名为user的bean


package com.fanyinhang.config;
import com.fanyinhang.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(value={"com.fanyinhang.dao"})
public class AnnotationConfig {
   @Bean()
   public User user1(){
       return new User(2,"李四");
   }
}

UserDao配置如下:


package com.fanyinhang.dao;
import com.fanyinhang.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

/**
* @author fanyinhang
* @version 1.0
* @create 2019/10/8-19:17
*/
@Repository
public class UserDao {
   @Autowired()
   private User user1;

@Override
   public String toString() {
       return "UserDao{" +
               "user1=" + user1 +
               '}';
   }
}

import com.fanyinhang.config.AnnotationConfig;
import com.fanyinhang.dao.UserDao;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author fanyinhang
* @version 1.0
* @create 2019/10/8-19:18
*/
public class Test3 {
   @Test
   public void testAutowired(){
       AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnotationConfig.class);
       UserDao userDao = context.getBean(UserDao.class);
       System.out.println(userDao);
   }
}

输出结果如下:

UserDao{user1=User(id=2, name=李四)}

没有加入@Value注解时是没有问题的,但是加入了@Value之后


package com.fanyinhang.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author fanyinhang
* @version 1.0
* @create 2019/10/8-19:11
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Component
public class User {
   @Value("1")
   private Integer id;
   @Value("张三")
   private String name;
}

再次运行testWired方法后

结果输出如下:

UserDao{user1=User(id=1, name=张三)}

为什么会出现这种情况?

一开始,怎么也想不通,查看网上的资料大多数是说@Bean和@Value有执行顺序这一说法。

为了验证这一说法,做个对比试验

去掉了一个@Value(“张三”)


package com.fanyinhang.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author fanyinhang
* @version 1.0
* @create 2019/10/8-19:11
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Component
public class User {
   @Value("1")
   private Integer id;
   //@Value("张三")
   private String name;
}

结果输出如下:

UserDao{user1=User(id=1, name=李四)}

问题原因

@Value和@Bean在不同文件下时,@Bean比@Value先执行。这样就回导致@Bean注入的值失效。

解决办法

网上说@Value和@Bean在不同文件下时,@Value比@Bean先执行,因此,我做了如下设置

把User.java下的@Value注解去掉,而是将@Value注解放在@bean同一文件下


package com.fanyinhang.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
/**
* @author fanyinhang
* @version 1.0
* @create 2019/10/8-19:11
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Component
public class User {
   private Integer id;
   private String name;
}

package com.fanyinhang.config;
import com.fanyinhang.bean.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(value={"com.fanyinhang.dao"})
public class AnnotationConfig {
   @Bean()
   public User user1(@Value("1") Integer id,@Value("张三") String name){
       return new User(2,"李四");
   }
}

此时再运行测试方式,输出结果如下:

UserDao{user1=User(id=2, name=李四)}

来源:https://blog.csdn.net/qq_27397913/article/details/102407052

标签:@Value,@Bean,顺序
0
投稿

猜你喜欢

  • intellij idea中spring boot properties文件不能自动提示问题解决

    2021-09-24 09:53:46
  • java LRU(Least Recently Used )详解及实例代码

    2022-10-08 10:42:43
  • C# 多线程学习之基础入门

    2022-11-08 05:38:13
  • 解决idea爆红 cant resolve symbol String的问题解析

    2023-10-11 10:47:30
  • android编程实现图片库的封装方法

    2023-12-20 07:51:27
  • C#操作EXCEL DataTable转换的实例代码

    2022-05-18 04:25:15
  • 如何利用java控制鼠标操作一些重复的事情

    2021-11-12 12:54:02
  • 掌握Android Handler消息机制核心代码

    2023-11-29 18:29:23
  • Java 普通代码块静态代码块执行顺序(实例讲解)

    2022-07-11 05:44:28
  • 详解idea maven nexus 常见命令配置

    2021-06-07 18:29:03
  • 详解C语言内核字符串转换方法

    2022-12-09 13:53:55
  • springboot项目如何设置session的过期时间

    2022-12-31 23:45:27
  • Java单例模式利用HashMap实现缓存数据

    2021-12-15 20:21:42
  • Java中session存储Users对象实现记住密码

    2021-06-27 10:46:59
  • mybatis快速上手并运行程序

    2022-09-24 07:56:08
  • 解决Springboot get请求是参数过长的情况

    2023-11-27 16:45:37
  • Mybatis多表关联查询的实现(DEMO)

    2022-05-03 14:50:03
  • Shiro 控制并发登录人数限制及登录踢出的实现代码

    2023-09-18 02:03:56
  • Android SQLite数据库进行查询优化的方法

    2022-10-03 09:09:00
  • SpringBoot封装响应数据实现过程详解

    2023-01-17 21:32:51
  • asp之家 软件编程 m.aspxhome.com