项目结构描述:
赋值静态属性的类与主启动类不在同一个项目下,属于聚合项目,主启动类依赖了赋值静态属性的类的项目,两个项目的基础包路径是一致的。
.
.
赋值静态属性代码:
@Component
public class RedisLockUtil {
@Autowired
private RedisTemplate redisTemplate;
private static RedisTemplate staticRedisTemplate;
/**
* 项目启动后执行
*/
@PostConstruct
private void init() {
System.out.println("当前装配:" + redisTemplate);
this.staticRedisTemplate = this.redisTemplate;
System.out.println("当前静态:" + this.staticRedisTemplate);
}
}
主启动类:
@SpringBootApplication
public class DemoApplication {
}
调用:
@GetMapping("test")
public void test1() {
System.out.println(RedisLockUtil.staticRedisTemplate);
}
调用结果:
启动项目时并没有打印出init方法内的信息,说明init方法并没有执行。
.
解决:
SpringBoot在写启动类的时候如果不使用@ComponentScan指明对象扫描范围,默认指扫描当前启动类所在的包里的对象,如果你的其他包都在使用了@SpringBootApplication注解的主类所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了。
参考博客 : 跳转
// 添加基础包路径
@ComponentScan(basePackages = "com.demo.**")
@SpringBootApplication
public class DemoApplication {
}
主启动类上添加扫描基础包路径, 然后重启项目:
控制台打印了init方法里面的信息了,然后再调一下接口:
能取得值了
改造初始化方法
@Component
public class RedisLockUtil {
public static RedisTemplate staticRedisTemplate;
/**
* 项目启动后执行
*/
@Resource
private void setRedisTemplate(RedisTemplate redisTemplate) {
staticRedisTemplate = redisTemplate;
}
}
重启项目,调用接口结果:
也是可以的。
@Resource注解的使用 参考博客 : 跳转