`

普通类调用Spring bean对象

 
阅读更多

普通类调用Spring Bean对象

如果是Spring boot框架可以参考:

(17)Spring Boot普通类调用bean【从零开始学Spring Boot】 

--------------------------------------------------------

 

 

说明:

1》. 本文针对Java语言.

2》. 代码在实际项目中使用过.

 

需求的提出:

我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用spring提供的其他对象或者说有一些不需要交给spring管理,但是需要用到spring里的一些对象。如果这是spring框架的独立应用程序,我们通过

 

ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId"); 
 

 

这样的方式就可以很轻易的获取我们所需要的对象。

但是往往我们所做的都是Web Application,这时我们启动spring容器是通过在web.xml文件中配置,这样就不适合使用上面的方式在普通类去获取对象了,因为这样做就相当于加载了两次spring容器,而我们想是否可以通过在启动web服务器的时候,就把Application放在某一个类中,我们通过这个类在获取,这样就可以在普通类获取spring bean对象了,让我们接着往下看。

1. 通过Spring提供的工具类获取ApplicationContext对象
这种方式不需要修改任何的配置,只需要在你需要的地方,当然要求也比较高,需要能够获取HttpServletRequest对象,比如在jsp代码中使用,代码如下:

<%
  /**
   上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。
  */
  ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
  ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
  MyService service1 = (MyService)ac1.getBean("myService");//这是beanId. 
  MyService service2 = (MyService)ac2.getBean("myService");
  out.println("第一种方式1----:"+service1.getSystemTime());//获取系统时间
  out.println("<br />------------<br />");
  out.println("第一种方式2----:"+service2.getSystemTime());
%>

 

注:代码直接复制是不能正常运行的,需要修改bean的名称.

这种方式明显有很大的漏洞,感觉用起来不舒服,其一:需要request对象,其二:很难封装一个Java工具类。

 

2. 继承自抽象类ApplicationObjectSupport 

我们编写一个当启动web服务容器的时候,就将ApplicationContext注入到一个spring工具类的一个静态属性中,这样在普通类就可以通过这个工具类获取ApplicationContext,从而通过getBean( )获取bean对象。

我们把这个工具类取名为:ToolSpring放在net.angel.tools包下:

代码如下:

 

package net.angel.tools;
 
import javax.faces.application.Application;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ApplicationObjectSupport;
import org.springframework.web.context.support.WebApplicationObjectSupport;
 
/**
 * 获取spring信息的工具类
 * @author Administrator
 *
 */
public final class ToolSpring extends ApplicationObjectSupport {
private static ApplicationContext applicationContext = null;
 
@Override
protected void initApplicationContext(ApplicationContext context)
throws BeansException {
// TODO Auto-generated method stub
super.initApplicationContext(context);
if(ToolSpring.applicationContext == null){
ToolSpring.applicationContext = context;
System.out.println();
System.out.println();
System.out.println("---------------------------------------------------------------------");
System.out.println("========ApplicationContext配置成功,在普通类可以通过调用ToolSpring.getAppContext()获取applicationContext对象,applicationContext="+applicationContext+"========");
System.out.println("---------------------------------------------------------------------");
System.out.println();
System.out.println();
}
}
 
public static ApplicationContext getAppContext() {
return applicationContext;
}
public static Object getBean(String name){
return getAppContext().getBean(name);
}
}
 

 

 

 

编写完代码之后,我们需要在spring配置文件中加入:

<!-- 这个主要是用于普通类调用spring对象的配置,可以不配置id属性. -->

<bean id="toolSpring" class="net.angel.tools.ToolSpring"></bean>

这个配置,这步很重要,前往不能忘了,如果没有配置的话,获取的ApplicationContext将为null。

这样在启动的时候就会载入这个类,如果成功的话,会在控制台看到System.out.println的输出信息。

在普通类可以通过ToolSpring.getBean("beanId");获取spring的bean对象。

 

3. 继承自抽象类WebApplicationObjectSupport 

这种方式和第二种差不多,不过多介绍,直接给代码:

 

package net.angel.tools;
 
import javax.faces.application.Application;
 
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ApplicationObjectSupport;
import org.springframework.web.context.support.WebApplicationObjectSupport;
 
/**
 * 获取spring信息的工具类
 * @author Administrator
 *
 */
public final class ToolSpring extends WebApplicationObjectSupport{
private static ApplicationContext applicationContext = null;
 
 
@Override
protected void initApplicationContext(ApplicationContext context) {
// TODO Auto-generated method stub
super.initApplicationContext(context);
if(applicationContext == null){
applicationContext = context;
System.out.println();
System.out.println();
System.out.println("---------------------------------------------------------------------");
System.out.println("========ApplicationContext配置成功,在普通类可以通过调用ToolSpring.getAppContext()获取applicationContext对象,applicationContext="+applicationContext+"========");
System.out.println("---------------------------------------------------------------------");
System.out.println();
System.out.println();
}
}
 
 
public static ApplicationContext getAppContext() {
return applicationContext;
}
 
public static Object getBean(String name){
return applicationContext.getBean(name);
}
 
}

 

Spring配置文件加入:

<!-- 这个主要是用于普通类调用spring对象的配置,可以不配置id属性. -->

<bean id="toolSpring" class="net.angel.tools.ToolSpring"></bean>

 

4. 实现接口ApplicationContextAware

这种方式是实现接口的方式,本人比较喜欢这种方式,因为这种方式扩展性比较强,我们可以根据需要在加入其他的接口。方式跟以上几种方式差不多。

package net.angel.tools;
 
import javax.faces.application.Application;
 
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ApplicationObjectSupport;
import org.springframework.web.context.support.WebApplicationObjectSupport;
 
/**
 * 获取spring信息的工具类
 * @author Administrator
 *
 */
public final class ToolSpring implements ApplicationContextAware{
private static ApplicationContext applicationContext = null;
 
@Override
public  void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
// TODO Auto-generated method stub
if(ToolSpring.applicationContext == null){
ToolSpring.applicationContext  = applicationContext;
System.out.println();
System.out.println();
System.out.println("---------------------------------------------------------------------");
System.out.println("========ApplicationContext配置成功,在普通类可以通过调用ToolSpring.getAppContext()获取applicationContext对象,applicationContext="+applicationContext+"========");
System.out.println("---------------------------------------------------------------------");
System.out.println();
System.out.println();
}
}
 
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
 
 
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
}

  

在Spring配置文件中加入:

<!-- 这个主要是用于普通类调用spring对象的配置,可以不配置id属性. -->

<bean id="toolSpring" class="net.angel.tools.ToolSpring"></bean>

 

在其他类通过使用

ToolSpring.getBean("beanId");就可以进行调用了。

 

à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

分享到:
评论

相关推荐

    17. Spring Boot普通类调用bean【从零开始学Spring Boot】

    在Spring Boot框架中,普通类调用bean是常见的操作,特别是在构建复杂应用时。这篇博客“17. Spring Boot普通类调用bean【从零开始学Spring Boot】”旨在指导初学者如何在非Spring管理的类中访问和使用Spring容器中...

    Spring Boot中Bean定义方调用方式解析

    System.out.println("========ApplicationContext 配置成功,在普通类可以通过调用 SpringUtils.getAppContext() 获取 applicationContext 对象,applicationContext=" + SpringUtil.applicationContext + "========...

    spring自动扫描和管理Bean的示例

    1. **@Component**:这是最基础的注解,用于标记一个普通的Java类为Spring Bean。如果你的类没有特定的角色,可以使用此注解。 2. **@Service**:通常用于标记业务逻辑层的类。它继承自@Component,添加了一些默认...

    使用spring远程调用服务端接口实现WebService功能

    它是Spring框架中的一个关键组件,用于将普通的Java方法暴露为可以通过HTTP请求调用的服务。它基于HTTP协议,而不是SOAP或XML-RPC,因此更加轻量级且易于使用。HttpInvokerServiceExporter会自动处理请求的序列化和...

    spring 中特殊bean用法

    在Spring框架中,Bean是核心概念,它代表了应用程序中的对象,这些对象由Spring容器管理其生命周期和依赖关系。特殊Bean用法主要涉及Spring提供的多种高级特性,包括但不限于工厂方法、 prototype scope、AOP代理、...

    关于spring boot中几种注入方法的一些个人看法

    @Bean 是一个注解,用来将一个普通的对象转换为一个 Spring bean,以便可以在spring 容器中管理。@Bean 可以使用在方法上,以便将该方法的返回值转换为一个 Spring bean。 在 Spring Boot 中,以上几种注入方法都是...

    个人整理的Spring、SpringMVC、MyBatis相关知识的思维导图

    * bean 作用域:在 Spring 里面,bean 默认单实例对象,可以在 bean 标签中通过 scope 属性来设置 * scopesingleton 单实例,每一个 bean 只创建一个对象实例。 * prototype 多实例,原型,每次对该 bean 请求调用...

    Spring Bean三种注入方式详解

    构造器注入主要用于某些类因为某种原因不能作为 Bean,只是一个普通类。可以通过类的构造方法传入需要调用的 Bean 接口。这种方式的优点是可以确保依赖项的正确性,但需要注意的是,构造方法的参数顺序和类型必须与 ...

    Spring源码学习六:bean初始化1

    当`isFactoryBean(beanName)`返回`true`时,Spring会调用`FactoryBean`的`getObject()`方法来获取实际的Bean实例,而非直接实例化`RootBeanDefinition`所表示的对象。 在`preInstantiateSingletons()`过程中,如果...

    详解Spring中bean实例化的三种方式

    在Spring框架中,Bean的实例化是其核心功能之一,用于管理对象的生命周期和依赖关系。本文将详细探讨Spring中bean实例化的三种主要方式:普通构造方法创建、静态工厂创建和实例工厂创建。 1. 普通构造方法创建: 这...

    spring在IoC容器中装配Bean详解

    Spring 将先调用默认构造函数实例化 Bean 对象,然后通过反射的方式调用 Setter 方法注入属性值。 3.2 构造函数注入 构造函数注入是依赖注入的一种方式,它要求 Bean 的构造函数中注入依赖的对象。Spring 将根据...

    从零开始学Spring Boot

    1.20 Spring Boot普通类调用bean 1.21 使用模板(thymeleaf-freemarker) 1.22 Spring Boot 添加JSP支持 1.23 Spring Boot Servlet 1.24 Spring Boot过滤器、监听器 1.25 Spring Boot 拦截器HandlerInterceptor 1.26...

    spring-实例工厂注入

    Spring容器通过调用工厂类的方法来获取对象实例,并将其注入到依赖它的其他组件中。 二、配置实例工厂注入 1. 定义工厂类 首先,我们需要创建一个工厂类,这个类包含一个返回目标对象的静态或非静态方法。例如: `...

    【Spring】总结Spring整合Mybatis的底层原理实现步骤

    Bean与普通Java对象的区别在于,Bean是由Spring负责实例化的,同时,当从Spring容器中获取Bean时,Spring还会对Bean中带有`@Autowired` 注解的属性进行自动注入赋值,这是手工new对象无法实现的特性。Spring容器中的...

    Spring 简介 Spring 简介

    与其他容器相比,Spring 的一大特点是其Bean可以是普通的Plain Old Java Objects(POJOs),不需要实现特定接口或继承特定基类,这意味着Spring管理的对象在容器外部也可以正常使用,增强了代码的可复用性和灵活性。...

    Spring各种回调接口[定义].pdf

    当Bean实现此接口并容器实例化Bean时,`setBeanClassLoader(ClassLoader classLoader)`方法会被调用,传入负责加载该Bean的ClassLoader对象。这对于某些需要访问类加载器来加载资源或执行特定任务的Bean非常有用。 ...

    mybatis-spring-1.3.1

    通过这种方式,开发者可以直接在Spring环境中调用Mapper接口,如同调用普通的业务服务一样简单。 4. **Transaction Management**: MyBatis-Spring提供了Spring事务管理的支持,使得事务边界可以由Spring进行管理。...

    mybatis-spring-1.2.0.rar

    5. **MapperFactoryBean**:这是一个特殊的 Spring Bean 工厂,用于创建基于 MyBatis Mapper XML 文件的 Java 接口实例,使得可以在 Spring 中像调用普通服务一样调用 SQL 查询。 6. **MapperScannerConfigurer ...

Global site tag (gtag.js) - Google Analytics