java 手动创建对象与注入_解决SpringBoot中自己new出来的对象不能自动注入对象和属性的问题...

在类上加@Component或者其他注解时,该类会交给spring来管理,自动创建对象,但是如果是自己new出来的对象或者自己类没加注解,但是内部又需要注入其他对象以及需要注入配置文件中的属性时,有以下办法解决:

1、解决注入对象问题:

新建一个工具类,比如GetBeanUtil

public class GetBeanUtil implements ApplicationContextAware {

protected static ApplicationContext context;

@Override

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

context = applicationContext;

}

public static Object getBean(String name) {

return applicationContext.getBean(name);//name表示其他要注入的注解name名

}

public static T getBean(T c){

return applicationContext.getBean(c);//T表示类

}

}

举例使用上述工具类:

public MyClass

{

@AutoWired

private OtherClass otherClass;

}

上面类在new MyClass时,OtherClass类注入会失败,此时改进一下情况即可:(注意,OtherClass必须是spring注解过的)

public MyClass

{

private OtherClass otherClass = GetBeanUtil.getBean(OtherClass.class);

}

简单解释一下工具类为什么能够找到类,是因为在启动spring后,spring会将所有注解过的类加载容器内,并返回 给ApplicationContextAware,在其他注解后的类需要对象时,容器会自动注入,但是自己new的类缺不会被容器注入,此时,自己实现ApplicationContextAware,自己根据类的类型手动获得加载后的bean即可。

2、解决注入属性问题

创建一个工具类:

@Component//注意此时要加注解

public class GetPropertiesUtil

{

private static String properties;

public static Stirng getProperties()

{

return properties;

}

@Value("${properties}")

public void setProperties(String properties)

{

this.properties = proterties;

}

}

注意两点:1、该工具类要加上注解,否则会像第一种情况;

2、内部属性加@Value的地方是set方法上,而且set方法不是statis;

使用举例:

public MyClass

{

@Value("${properties}")

private String properties;

}

上面类在new MyClass时,xxx属性注入会失败,此时改进一下情况即可:

public MyClass

{

private String properties = GetPropertiesUtil.getProperties();

}

————————————————

版权声明:本文为CSDN博主「enjoy_Day」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_28080659/article/details/99687074

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 使用 FreeMarker 模板引擎,可以通过 `Environment` 对象的 `setVariable` 方法来设置模板需要的变量值。具体步骤如下: 1. 在 Spring Boot 应用注入 `FreeMarkerConfigurationFactoryBean` 对象,并通过 `setTemplateLoaderPath` 方法设置模板文件的路径: ``` @Configuration public class FreeMarkerConfig { @Bean public FreeMarkerConfigurationFactoryBean freeMarkerConfigurationFactoryBean() { FreeMarkerConfigurationFactoryBean factoryBean = new FreeMarkerConfigurationFactoryBean(); factoryBean.setTemplateLoaderPath("classpath:/templates/"); return factoryBean; } } ``` 2. 在控制器注入 `FreeMarkerConfigurer` 对象,并通过 `getConfiguration` 方法获取 `Environment` 对象: ``` @Controller public class IndexController { @Autowired private FreeMarkerConfigurer freeMarkerConfigurer; @RequestMapping("/") public String index(Model model) throws Exception { Environment env = freeMarkerConfigurer.getConfiguration().getEnvironment(); // TODO: 设置模板变量值 return "index"; } } ``` 3. 使用 `setVariable` 方法设置模板变量值: ``` env.setVariable("user", ObjectWrapper.DEFAULT_WRAPPER.wrap(user)); ``` 其,`user` 是一个 Java 对象,`ObjectWrapper.DEFAULT_WRAPPER` 用于将 Java 对象转换为 FreeMarker 支持的数据类型。 完整代码示例: ``` @Controller public class IndexController { @Autowired private FreeMarkerConfigurer freeMarkerConfigurer; @RequestMapping("/") public String index(Model model) throws Exception { Environment env = freeMarkerConfigurer.getConfiguration().getEnvironment(); User user = new User("张三", "123456"); env.setVariable("user", ObjectWrapper.DEFAULT_WRAPPER.wrap(user)); return "index"; } } public class User { private String name; private String password; public User(String name, String password) { this.name = name; this.password = password; } // getter 和 setter 方法省略 } ``` 在模板可以通过 `${user.name}` 和 `${user.password}` 访问 `User` 对象属性值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值