在应用中一般普通的JavaPojo都是由Spring来管理的,所以使用autowire注解来进行注入不会产生问题,但是有两个东西是例外的,一个是 Filter,一个是Servlet,这两样东西都是由Servlet容器来维护管理的,所以如果想和其他的Bean一样使用Autowire来注入的 话,是需要做一些额外的功夫的。
对于Filter,Spring提供了DelegatingFilterProxy,所以本文主要讲述Servlet的解决。
1、比较直观但是不大优雅的做法是重写init()方法,在里面使用AutowireCapableBeanFactory来手工告诉Spring:我这个Servlet是需要这样的一个Bean的。具体写法:
public void init(ServletConfig servletConfig) throws ServletException {
ServletContext servletContext = servletConfig.getServletContext();
WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
AutowireCapableBeanFactory autowireCapableBeanFactory = webApplicationContext.getAutowireCapableBeanFactory();
autowireCapableBeanFactory.configureBean(this, BEAN_NAME);
}
其中,BEAN_NAME就是需要注入的Bean在spring中注册的名字.
这样写的主要问题是就是那个BEAN_NAME,这样写有点主动查找,而不是依赖注入的感觉。
2、创建一个类似于DelegatingFilterProxy那样的代理,通过代理根据配置来找到实际的Servlet,完成业务逻辑功能。
假定我们有一个Servlet名字叫UserServlet,需要注入一个UserManager,伪代码如下:
public class UserServlet extends HttpServlet {
@Autowired(required = true)
private UserManager userManager;
}
第一步:
public class DelegatingServletProxy extends GenericServlet {
private String targetBean;
private Servlet proxy;
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
proxy.service(req, res);
}
@Override
public void init() throws ServletException {
this.targetBean = getServletName();
getServletBean();
proxy.init(getServletConfig());
}
private void getServletBean() {
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.proxy = (Servlet) wac.getBean(targetBean);
}
}
第二步:
配置web.xml文件,原来UserServlet的配置大致是这样的:
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>com.sample.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/userServlet</url-pattern>
</servlet-mapping>
现在修改为
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>com.sample.DelegatingServletProxy</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/userServlet</url-pattern>
</servlet-mapping>
注意,spring是根据Servlet的名字来查找被代理的Servlet的,所以,首先我们要在UserServlet类前面加上 @Component,来告诉Srping:我也是一个Bean。如果名称和Web.xml里面定义的不一样的话,可以在这里指定Bean的名字,比如: @Component("userServlet")
分享到:
相关推荐
Spring以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)闻名,为Java开发者提供了一个强大而灵活的基础架构。 1. **新建Java Web项目**: 开始项目时,我们首先创建...
这里将`autowire`属性设置为`byName`,意味着Spring框架将尝试自动装配与bean名称匹配的其他bean。 ### 小结 通过对给定文件的分析,我们了解了Spring框架中XML配置的基本用法,包括如何配置`...
在Spring中,我们可以通过setter方法、构造方法或autowire的方式来装配Bean。 例如,在`Person`类中,我们可以通过setter方法来装配`car`对象: ```java public class Person { private Car car; public void ...
6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...
6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...
- **字段注入**:通过使用注解@Autowire或者@Autowired来实现,Spring会自动为bean的字段注入相应的依赖。 ### AOP(面向切面编程) Spring AOP模块提供了面向切面编程的实现,允许开发者定义方法拦截器和切点来...
<bean id="WebSocketConfig" class="org.springframework.web.socket.config.annotation.WebSocketConfigurer" autowire="byType"> </bean> <bean id="serverEndpointExporter" class="org.springframework.web....
在业务逻辑实现中,我们需要使用Spring的Annotation-config来启用注解式配置,使用@ComponentScan来扫描相关的Bean,使用@Autowire来自动注入相关的Bean。然后,我们需要实现登录注册功能的具体业务逻辑,例如用户...
网上的东西好大多都不能直接用,自己结合网上资料做了一个Struts2+Spring3+MyBatis3的测试工程,JUnit测试用例和WEB服务。 内涵完整jar包,解压直接可用,包括一个表文件。 Eclipse3.2+Tomcat/5.5+jdk1.5.0_17 - ...
这个策略指示Spring自动根据bean的属性名称查找相同名称的bean来注入。如果在不同的配置文件中设置,会影响Spring容器如何解析和注入bean。例如,如果在所有配置文件中都设置,可能会导致多个bean之间的冲突;如果...
Spring 框架提供了自动装配机制,根据指定的原则(通过<Bean>的 autowire 属性指定)进行 Bean 的自动装配。Spring 本身为 autowire 属性提供了五个选项:no、byName、byType、constructor 和 autodetect。其中,no ...
ResourceServlet ResourceUtils ResponseTimeMonitor ResponseTimeMonitorImpl ResultSetExtractor ResultSetSupportingSqlParameter ResultSetWrappingSqlRowSet ResultSetWrappingSqlRowSetMetaData ...
3. **applicationContext.xml**:Spring的核心配置文件,定义了Bean的实例化、依赖注入等。 ```xml <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> ...
2. **Spring管理Struts Action**:通过Spring的Autowire注解或XML配置,使Action由Spring容器管理。 3. **Spring管理Hibernate SessionFactory**:配置数据源、SessionFactory,使用Spring的HibernateTemplate或...
- **applicationContext.xml**:Spring的核心配置文件,用于管理Bean的生命周期和依赖注入。 - **web.xml**:Web应用的核心配置文件,用于配置Servlet容器的初始化参数、监听器等。 ### 关键配置文件详解 #### ...
Spring 简化了 Bean 的配置,提供了自动装配(autowire)机制,根据指定的原则(通过 <Bean> 的 autowire 属性指定)进行 Bean 的自动装配。Spring 本身为 autowire 属性提供了五个选项:no、byName、byType、...
- **applicationContext.xml**:Spring的核心配置文件,配置了Bean的声明周期管理和依赖注入。 ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...
- **@Bean**:标记方法为 Bean 生产者,返回的对象将被添加到 Spring 容器中。 以上是 SpringBoot 学习的一些基础知识点,涵盖项目创建、HTTP 请求处理、文件上传及常用注解的使用。深入学习 SpringBoot 还需理解...
- **对象工厂**:文档通过在`struts.xml`中设置`struts.objectFactory.value`和`struts.objectFactory.spring.autoWire`来指定使用Spring作为对象工厂,并自动装配Bean。 - **Action的注册**:Action类被注册在...
Spring 简化了 Bean 的配置,提供了自动装配(autowire)机制,根据指定的原则(通过<Bean>的 autowire 属性指定)进行 Bean 的自动装配,Spring 本身为 autowire 属性提供了五个选项:no、byName、byType、...