转:https://blog.csdn.net/zlj1217/article/details/81612102
背景
在最近的开发工作中,用到了策略模式(之前也写过关于策略模式这个设计模式的学习,但是之前那个不是在spring框架中),这时候策略中的context或者factory就要去动态的根据调用的策略类型不同去拿到对应的bean对象,这里去了解了一个通过application context拿取bean的工具类,这里记录一下。
话不多说,直接上代码
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import java.lang.annotation.Annotation; import java.util.Map; @Component @Slf4j public class ApplicationContextBeanUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; /** * 利用aware注入application * * @param applicationContext * @throws BeansException */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { // 注入application ApplicationContextBeanUtil.applicationContext = applicationContext; } private static ApplicationContext getApplicationContext() { return applicationContext; } /** * 通过name获取bean * * @param name * @return */ public static Object getBean(String name) { return getApplicationContext().getBean(name); } /** * 通过class获取bean * * @param clazz * @param <T> * @return */ public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } /** * 通过name和class获取bean * * @param name * @param clazz * @param <T> * @return */ public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); } /** * 根据clazz类型获取spring容器中的对象 * * @param clazz * @param <T> * @return */ public static <T> Map<String, T> getBeansOfType(Class<T> clazz) { return getApplicationContext().getBeansOfType(clazz); } /** * 根据注解类从容器中获取对象 * * @param clazz * @param <T> * @return */ public static <T> Map<String, Object> getBeansOfAnnotation(Class<? extends Annotation> clazz) { return getApplicationContext().getBeansWithAnnotation(clazz); } }
这是通过实现ApplicationContextAware接口去实现注入application的,这里应该注意几点:
1. application应该是静态的。这个Util类应该是在别的类中直接调用获取bean的静态方法,所以注入的applicationContext应该都是该类的静态变量。
2. 要用注解或者在xml文件中将这个Util配置成bean。(这里用的spring boot,就直接配置的扫描)。
3. 在其中提供了一些获取bean的方法。
这里去记录下,方便在之后的工作中遇到了之后去直接使用
相关推荐
Spring Boot普通类调用bean【从零开始学Spring Boot】”旨在指导初学者如何在非Spring管理的类中访问和使用Spring容器中的bean。下面将详细讲解这个主题。 首先,了解Spring Boot的基础概念是必要的。Spring Boot...
在静态工具类中,使用了public static的成员变量来存储配置信息,使用非静态的set方法将配置信息注入到成员变量中。其他类可以通过公有的静态get方法来获取这些配置信息。 在上面的代码中,使用了MongoConfig类来...
这样,我们就能在普通类中获取到Spring管理的bean实例。 2. **@Autowired**:如果普通类也是Spring的一部分,即它也被Spring管理,那么可以使用注解`@Autowired`来自动装配bean。这样,Spring会自动找到类型匹配的...
例如,`@ConditionalOnClass`和`@ConditionalOnMissingClass`注解可以根据类是否存在于类路径中来决定是否注册Bean。 6. **自动装配(Autowired)**: Spring的自动装配功能可以自动将依赖注入到Bean中,无需手动...
`@Configuration`类表示这是一个配置类,`@Bean`注解方法表示该方法的返回值将作为一个Bean注册到Spring容器。 ```java @Configuration public class AppConfig { @Bean public HelloWorldService ...
通常,`biz`层会包含应用程序的核心业务逻辑,而`support`层则可能包含工具类、数据访问对象(DAO)或其他辅助组件,它们可能都依赖于Spring管理的Bean。通过正确地配置和使用`Spring-Aware`接口以及理解Bean的作用...
【标题】:在Java EE环境中,使用Apache CXF与Spring框架整合实现Web服务,返回List、Bean、String、JSON及XML的完整项目实例 【描述】:本项目旨在展示如何在Java企业级应用(Java EE)中,通过Apache CXF框架创建...
Spring 运行时动态注册 Bean 的方法需要我们定义一个没有被 Spring 管理的控制器类,一个获取 Spring 上下文的工具类,以及在 SpringBoot 的启动类中保存当前 Spring 上下文。最后,我们可以在另一个被 Spring 管理...
- Java配置:在Java配置类中,可以使用`@Bean`注解来创建数据源: ```java @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource....
本教程将详细讲解如何在Spring Boot项目中集成MyBatis和PageHelper,并创建一个实用的DaoUtils工具类。 首先,我们需要在Spring Boot项目中引入MyBatis和PageHelper的依赖。在`pom.xml`文件中添加以下依赖: ```...
在本文中,我们将深入探讨如何将SpringBoot与Redis集成,并创建实用工具类来处理不同类型的Redis数据存储。SpringBoot以其简化微服务应用开发而闻名,而Redis则是一种高性能的键值存储系统,常用于缓存、消息队列等...
通过`ApplicationContext`,我们可以获取到Spring容器管理的所有Bean,或者根据Bean的名称或类型来获取特定的Bean实例。本文将详细介绍如何在Spring中通过`ApplicationContext`的`getBean`方法获取注入对象,并通过...
例如,`@Value("${property.name}")`可以从`application.properties`中获取配置。 4. **@Resource**:与`@Autowired`类似,但主要基于名称匹配,通常用于JSR-250规范的注入。 接下来,我们看看如何在实际应用中...
在测试类中,我们可以看到如何初始化`Scheduler`实例,以及如何使用`ApplicationContext`获取Job类的Bean并添加到调度器中。例如,`TestQuartzTimer`可能有以下代码片段: ```java @Autowired private ...
如果使用了`BeanUtil`,则需确保工具类中的bean获取逻辑无误。 解决这个问题的一般步骤包括: 1. **检查配置**:仔细审查`dubbo_consumer.xml`和`spring-rabbitmq.xml`,确保所有配置正确无误。 2. **调试代码**:...
12.2.2. 在Spring的application context中创建 SessionFactory 12.2.3. HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. ...
方法二:通过 Spring 提供的工具类获取 ApplicationContext 对象 在 B/S 系统中,通过 ServletContext 对象可以获取 WebApplicationContext 对象,然后通过它获取需要的类实例: `import org.springframework.web....
1. **spring-beans.jar**:包含Bean工厂和依赖注入的相关类,如`org.springframework.beans.factory`包下的BeanFactory接口和实现,以及`org.springframework.beans`包下的各种Bean处理工具类。 2. **spring-core....
下面是对该工具类中的关键方法进行详细解析: - **findBean 方法**:该方法首先通过 `FacesContext` 获取当前的 `ServletContext`,然后使用 `WebApplicationContextUtils.getRequiredWebApplicationContext` 方法...
在Spring配置类中,定义一个`RedisTemplate` bean,配置序列化方式,这里我们使用JdkSerializationRedisSerializer和StringRedisSerializer: ```java @Bean public RedisTemplate, Object> redisTemplate...