javaSpring获取Bean的几种方式

本文介绍了五种在Spring框架中获取ApplicationContext对象的方法,包括通过配置文件初始化、利用工具类、继承特定抽象类、实现特定接口等,适用于不同应用场景。

方法一:在初始化时保存ApplicationContext对象 代码:
ApplicationContext ac = new FileSystemXmlApplicationContex("applicationContext.xml");
ac.getBean("beanId");
说明:
这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。

方法二:通过Spring提供的工具类获取ApplicationContext对象
代码:
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");
说明:
这种方式适合于采用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);


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

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

方法五:实现接口ApplicationContextAware
说明:
实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。

以上方法适合不同的情况,请根据具体情况选用相应的方法。
这里值得提一点的是,系统中用到上述方法的类实际上就于Spring框架紧密耦合在一起了,因为这些类是知道它们是运行在Spring框架上的,因此,系统中,应该尽量的减少这类应用,使系统尽可能的独立于当前运行环境,尽量通过DI的方式获取需要的服务提供者。        然后在Action中编写如下代码得到Context,(我是覆盖了Struts Action的setServlet方法,也许还有更好的方法)。      public void setServlet(ActionServlet servlet){
super.setServlet(servlet);
ServletContext servletContext = servlet.getServletContext();
WebApplicationContext wac =    WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
// get yours beans      }


我需要在spring的bean中直接获取,这下可和我们常规的操作有些不同,因为spring的bean都是pojo的。根本见不着servletconfig和servletcontext的影子。   这里我需要指出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对象的方式Spring框架中,Bean对象的定义方式主要分为三种:通过XML配置文件定义、通过注解定义以及通过Java配置类定义。以下是每种方式的具体描述: #### 1. XML配置文件定义Bean 在XML配置文件中,`<bean>`元素用于定义一个Bean对象。每个`<bean>`元素包含`id`或`name`属性(用于标识Bean)和`class`属性(指定Bean的实现类)。例如[^1]: ```xml <bean id="bean1" class="edu.cqie.ssm.bean1"/> <bean name="bean2" class="edu.cqie.ssm.bean2"/> ``` 上述示例中,`bean1`和`bean2`分别通过`id`和`name`属性定义了两个Bean对象。 #### 2. 注解方式定义Bean Spring框架支持通过注解来定义Bean对象。常用的注解包括`@Component`、`@Service`、`@Repository`和`@Controller`等。这些注解可以标记在类上,Spring容器会自动扫描并注册这些类为Bean对象。例如: ```java @Component("myBean") public class MyBean { // 类内容 } ``` 此外,还可以使用`@Bean`注解在方法上定义Bean对象。这种方式通常与`@Configuration`注解结合使用。例如: ```java @Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); } } ``` #### 3. Java配置类定义Bean Java配置类是一种基于Java代码的配置方式,取代传统的XML配置文件。通过`@Configuration`注解标记的类,以及类中的`@Bean`注解标记的方法,可以定义Bean对象。例如: ```java @Configuration public class AppConfig { @Bean public MyService myService() { return new MyServiceImpl(); } } ``` 上述代码中,`myService`方法返回的对象将被注册为Spring容器中的一个Bean对象。 ### 获取Bean对象的方式 除了定义Bean对象的方式外,还需要注意获取Bean对象时的区别。例如,当使用FactoryBean时,可以通过`getBean("&userFactoryBean")`获取FactoryBean本身,而通过`getBean("userFactoryBean")`获取的是FactoryBean创建的对象[^2]。 ### 总结 Spring框架中定义Bean对象的方式主要包括XML配置文件、注解和Java配置类三种方式。每种方式各有优缺点,开发人员可以根据项目需求选择合适的方式来定义Bean对象。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值