Spring提供了对配置中创建对象的字段实例注入。但如果是通过代码创建或者动态创建的对象,由于不受Spring管理,因此没有机会执行字段实例的注入。Google了一把,没发现可以用的方法。因此只能写了一小段代码。对于这种情况,可以通过反射的方式找到对象的字段和方法定义,并注入之。以下为具体实现。Registry类保存了Spring生成的context,在需要的时候随时可以调用。
public final class Registry
{
private Registry() {}
private static ApplicationContext context;
public static void setApplicationContext(ApplicationContext context)
{
Registry.context = context;
}
public static <T> T getBean(String configName, Class<T> cls)
{
return getBean(configName, cls, null);
}
public static <T> T getBean(String configName, Class<T> cls, T defaultValue)
{
assert (context != null);
T value = context.getBean(configName, cls);
return (value != null) ? value : defaultValue;
}
public static void wire(Object o)
{
wire(o, o.getClass());
}
private static void wire(Object o, Class<?> cls)
{
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
Autowired autowired = field.getAnnotation(Autowired.class);
if (autowired != null) {
Class<?> fieldClass = field.getDeclaringClass();
Object bean = context.getBean(fieldClass);
if (bean != null) {
field.setAccessible(true);
try {
field.set(o, bean);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Method[] methods = cls.getDeclaredMethods();
for (Method method : methods) {
Autowired autowired = method.getAnnotation(Autowired.class);
if (autowired != null) {
Class<?>[] paramTypes = method.getParameterTypes();
if (paramTypes.length == 1) {
Object bean = context.getBean(paramTypes[0]);
if (bean != null) {
method.setAccessible(true);
try {
method.invoke(o, bean);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
Class<?> superCls = cls.getSuperclass();
if (!superCls.equals(Object.class)) {
wire(o, superCls);
}
}
public static void stopContext()
{
assert (context != null);
((Lifecycle) context).stop();
}
}
分享到:
相关推荐
在Spring框架中,`@Bean`注解是一个关键的组件,用于声明一个方法将返回的对象作为Spring容器中的bean。在`@Bean`中定义`initMethod`属性,可以指定该bean初始化时需要调用的方法。当`initMethod`被设置为异步执行,...
总结来说,Spring Boot允许开发者轻松地在普通类中使用bean,通过Spring容器的强大功能来管理对象和依赖。通过理解并熟练运用上述知识点,可以更高效地开发Spring Boot应用。博客"17. Spring Boot普通类调用bean【从...
Spring通过依赖注入的方式,可以在运行时动态地将依赖注入到相应的组件中,这样就可以避免硬编码和其他类型的静态绑定,从而提高了系统的灵活性和可扩展性。 #### 三、BeanFactory与ApplicationContext 在Spring中...
5. **依赖注入**:容器自动处理Bean之间的依赖关系,无需在代码中显式创建或查找依赖对象。 ### 5. 进阶使用 - **AOP代理**:IoC容器可以结合Spring的面向切面编程(AOP)功能,为Bean创建代理,实现横切关注点。 ...
Spring通过容器来创建、配置和管理这些Bean。Bean的定义可以被继承,允许子Bean继承父Bean的配置信息。而Bean的作用域描述了Bean的生命周期及其可见性,例如singleton(单例)、prototype(原型)等。 Spring还提供...
在Spring框架中,Bean是一个由Spring容器管理的对象,通常代表应用中的业务组件或服务。Spring会负责Bean的创建、初始化、装配以及销毁等生命周期管理。 1. **`@Autowired`注解** `@Autowired`是Spring提供的一个...
Bean是由Spring容器创建、初始化、装配并管理的对象。它们可以通过XML、Java注解或基于Java的配置进行定义。 5. **XML配置**:尽管现在更倾向于使用Java注解或Java配置,但XML仍然是Spring早期版本中配置Bean的常见...
2. **Bean工厂(Bean Factory)与ApplicationContext**:Bean Factory是Spring容器的基本实现,而ApplicationContext在Bean Factory的基础上添加了更多企业级服务,如消息源、应用事件和国际化支持。 3. **AOP**:...
通过Spring IoC容器,可以将对象的创建、配置和组装的责任从应用程序代码中分离出来。 - **3.2 容器概述** - **3.2.1 配置元数据** - Spring IoC容器使用配置元数据来了解如何创建和配置bean。这些元数据可以是...
通过使用注解(如@Autowired)或XML配置,Spring容器能够自动地为对象注入所需的依赖,这极大地提高了代码的灵活性和可测试性。 在Spring 5中,对Java 8及更高版本的支持得到了强化。这意味着你可以充分利用Java 8...
Spring 的核心特性之一是依赖注入,它允许开发者在运行时通过容器来管理对象及其依赖关系,而不是在代码中硬编码。这提高了代码的可测试性和可维护性,因为对象的创建和组装过程被解耦。 2. **Bean 容器(Bean ...
而控制反转则是一种设计模式,通过容器来管理对象的生命周期以及对象间的关系,从而将对象创建和使用的责任从应用代码转移给Spring容器。 ### Spring Framework 4.x新特性 #### Spring Framework 4.0 4.0版本中,...
标题中的“一段Spring代码引起的调用绑定总结”指的是在使用Spring框架进行开发时,由于代码编写或配置不当,可能会遇到一些调用绑定的问题。这些问题通常涉及到依赖注入、AOP(面向切面编程)以及方法调用的上下文...
在源代码中,`BeanFactory`和`ApplicationContext`是IoC容器的主要接口,它们负责加载配置,创建和管理bean。 Spring的AOP模块则提供了声明式事务管理、日志记录、性能监控等功能。在源代码中,`Advisor`、`...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器来负责,从而实现了依赖倒置,增强了代码的可测试性和可维护性。DI(Dependency Injection,依赖注入)...