`

普通类调用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】

    NULL 博文链接:https://412887952-qq-com.iteye.com/blog/2292388

    从零开始学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...

    SpringBoot学习笔记完整教程

    Spring Boot 学习笔记,包括底层实现原理及...12. Spring boot 普通类调用 Bean 13. spring boot 使用模板引擎 14. Spring boot 集成 JSP 15. Spring boot 集成 servlet 16. Spring boot 集成 Fliter 和 Linstener

    Spring.3.x企业应用开发实战(完整版).part2

    2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao 2.3.3 LoginLogDao 2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 UserService 2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 ...

    Spring3.x企业应用开发实战(完整版) part1

    2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao 2.3.3 LoginLogDao 2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 UserService 2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 ...

    jTester使用指南(带书签).pdf

    对普通PoJo对象进行断言 判断2个PoJo对象是否相等 对2个PoJo对象指定的属性进行比较 断言Map对象 断言Collection对象或Array对象 第 4 章 使用DataMap准备和验证数据 为什么要使用DataMap? 配置jtester....

    SpringBoot 学习笔记+完整教程

    * 普通类调用 Bean * 使用模板引擎 * 集成 JSP * 集成 servlet * 集成 Fliter 和 Linstener * 拦截器 HandlerInterceptor * 系统启动任务 CommandLineRunner * 集成 Junit 单元测试 * 读取系统环境变量 * 使用自定义...

    springboot学习思维笔记.xmind

    SpringEL和资源调用 注入普通字符 注入操作系统属性 注入表达式云算结果 注入其他Bean的属性 注入文件内容 注入网址内容 注入属性文件 Bean的初始化和销毁 Java配置方式 注解方式 ...

    基于maven项目的SSM框架与layu前端框架的代码

    在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter...

    springmybatis

    MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...

    DWR.xml配置文件说明书(含源码)

    配置文件init部分声明那些用于建立远程bean和在方法调用中转换bean的类.这部分是可选择性配置的,多数情况下可以不必使用它,如果你想定义一个新的creator或者converter那么就必须在部分中声明,but do double check on...

    详解Spring关于@Resource注入为null解决办法

    主要介绍了详解Spring关于@Resource注入为null解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    spring-configurable-sample

    #自述文件使用 spring @Configurable 注释的“原型”bean 类型的示例(也请记住单例 bean),即使用普通的“new”运算符创建 bean,然后 spring 进一步控制初始化 bean,替换 @Value 占位符 bean 属性上的值,调用 ...

    MyRestUtil:基于springboot的rest调用框架,定义接口然后即可直接注入使用

    MyRestUtil给部门写的...更新记录2017.10.11 将 RestUtilInit 由普通bean修改为 BeanFactoryPostProcessor ,保证IRequestHandle优先与其他任何bean注册到容器中解决bean的依赖问题,不需要在接口类中增加 @Lazy 注解

    java微信公众号MVC开发框架

    微信控制器类是用@Weixin注解的普通类,与sprngmvc里面的controller很类似,方法的执行也很类似。我们在com.telecomjs.yc.controller包下建一个java类WeixinController,如下: package ...

    基本于J2EE的Ajax宝典.rar

    19.4.3 将 Spring容器中的 Bean 转化成JavaScript 对象 113 19.5 在客户端调用 JavaScript 对象 114 19.5.1 获取 Blog文章列表 115 19.5.2 控制 Blog文章列表的翻页 116 19.5.3 页面加载时的动作 117 19.5.4 ...

Global site tag (gtag.js) - Google Analytics