`
wb1991wb
  • 浏览: 153516 次
  • 来自: 上海
社区版块
存档分类
最新评论

【转】java普通类获取spring bean的五种方法

 
阅读更多

方法一:在初始化时保存ApplicationContext对象

说明:
   
这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。

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

 

 方法二:通过Spring提供的工具类获取ApplicationContext对象
说明:
     
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null

其中 servletContext sc 可以具体换成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext();

另外,由于spring是注入的对象放在ServletContext中的,所以可以直接在ServletContext取出WebApplicationContext 对象:

WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)
ac1.getBean("beanId");
ac2.getBean("beanId");

 

 方法三:继承自抽象类ApplicationObjectSupport
   
说明:
    
抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContextSpring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。

方法四:继承自抽象类WebApplicationObjectSupport
   
说明:
        
类似上面方法,调用getWebApplicationContext()获取WebApplicationContext

 

 

方法五:实现接口ApplicationContextAware
  
说明:
    
实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。
 
以上方法适合不同的情况,请根据具体情况选用相应的方法。
这里值得提一点的是,系统中用到上述方法的类实际上就于Spring框架紧密耦合在一起了,因为这些类是知道它们是运行在Spring框架上的,因此,系统中,应该尽量的减少这类应用,使系统尽可能的独立于当前运行环境,尽量通过DI的方式获取需要的服务提供者。

 

 

 

 

     然后在Action中编写如下代码得到Context,(我是覆盖了Struts ActionsetServlet方法,也许还有更好的方法)。

 public void setServlet(ActionServlet servlet){
         super.setServlet(servlet);
         ServletContext servletContext = servlet.getServletContext();
        WebApplicationContext wac =    WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
         // get yours beans

     }


 我需要在springbean中直接获取,这下可和我们常规的操作有些不同,因为springbean都是pojo的。根本见不着servletconfigservletcontext的影子。

  这里我需要指出spring给我们提供了两个接口:org.springframework.web.context.ServletContextAware

org.springframework.web.context.ServletConfigAware。我们可以让我们的bean实现上边的任何一个接口就能获取到servletContext .

代码如下:

public class DicBean implements ServletContextAware{
    
private ServletContext servletContext;

public void setServletContext(ServletContext sc) {
    this.servletContext=sc;
    System.out.println("项目的绝对路径为:"+servletContext.getRealPath("/"));
}
} 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    普通类调用Spring bean对象

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

    Spring — 基于Java类的配置 代码实例

    普通的POJO只要标注@Configuration注解,就可以为Spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供一个Bean的定义信息。 基于Java类的配置方法和基于XML或基于注解的配置方式相比,前者通过...

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

    * @Transactional 此注解可以标在类上,也可以标在方法上,表示当前类中的方法具有事务管理功能 Spring 配置类 * @Configuration 被此注解标注的类,会被 Spring 认为是配置类。 * @Import 在一个配置类中导入...

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

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    spring4.1核心包

    AspectJ可用于基于普通Java对象的模块化 注意:aop 和 aspects区别: http://www.oschina.net/translate/comparative_analysis_between_spring_aop_and_aspectj。 3. spring-beans-4.1.1.RELEASE.jar IOC的基础...

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

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Java常见面试题208道.docx

    12.普通类和抽象类有哪些区别? 13.抽象类能使用 final 修饰吗? 14.接口和抽象类有什么区别? 15.java 中 IO 流分为几种? 16.BIO、NIO、AIO 有什么区别? 17.Files的常用方法都有哪些? 二、容器 18.java 容器都有...

    Spring面试题详细讲解

    Spring 实现这一 AOP 功能的原理就使用代理模式对类进行方法级别的切面增强,代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。从结构上来看和 Decorator 模式类似,但 Proxy 是控制,更像是一种对...

    springmybatis

    mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in ...

    史上最全java面试,103项重点知识,带目录

    12. 普通类和抽象类有哪些区别? 6 13. 抽象类能使用 final 修饰吗? 6 14. 接口和抽象类有什么区别? 7 15. java 中 IO 流分为几种? 7 16. BIO、NIO、AIO 有什么区别? 7 17. Files的常用方法都有哪些? 8 二、...

    SpringBoot学习笔记完整教程

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

    spring基础

    它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO 属性名、类型都一致,您甚至...

    springboot学习思维笔记.xmind

    @Bean注解在方法上,声明当前方法的返回值为一个Bean AOP @Aspect 声明是一个切面 拦截规则@After @Before @Around PointCut JoinPoint Spring常用配置 Bean的Scope Singleton ...

    Java开发学习(六)----DI依赖注入之setter及构造器注入解析.doc

    普通方法(set 方法)、构造方法、引用类型、简单类型(基本数据类型与 String)等。Spring 框架基于这些知识点,为我们提供了两种注入方式:setter 注入和构造器注入。 二、setter 注入 setter 注入是指通过 ...

    SpringBoot @ConfigurationProperties使用详解(源代码)

    使用@ConfigurationProperties注解到普通类,然后再通过@EnableConfigurationPropertiesz注解到启动类中定义为Bean。 这里User对象并没有使用@Component相关注解。 @EnableConfigurationProperties 关于@...

    java微信公众号MVC开发框架

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

    JavaEE企业级应用开发教程(Spring+SpringMVC+MyBatis)习题(2022).pdf

    1. @Controller 注解:@Controller 注解通常作用在控制层,如 Spring MVC 的 Controller,用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 2. @Transactional 注解:@Transactional 注解主要...

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

    Spring Bean依赖项查找规则 特殊实现类的bean注册 自动注册的bean如何实现spring的init-method方法 声明bean的简单属性 使用@SpringBeanFrom DIY你需要的bean Spring模块注解 第 6 章 反射调用私有方法或JDK代理...

    26个阿里 Java 开源项目,很全面!

    1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件...强大(支持普通JDK类包括任意Java Bean

    spring+SpringMVC+MyBatis

    方案一:在构建这三层种你可以利用普通的Java方式构建三层。方案二:使用框架的方式构建三层. 在控制层中你可以使用方案一:使用Servlect 方案二使用springMVC框架。在这里你有两种方案。1 配置文件的方式 方案2 利用...

Global site tag (gtag.js) - Google Analytics