来自XmlWebApplicationContext javadoc:
默认情况下,配置将从"/WEB-INF/applicationContext.xml"获取根上下文,而"/WEB-INF/test-servlet.xml"获取具有命名空间"test-servlet"的上下文(如对于具有servlet-name"test"的DispatcherServlet实例.
Spring语境是什么意思?
什么是根背景?还有哪些其他类型的Spring上下文?
什么是命名空间?
更新:
一些后续问题:
什么是Spring ApplicationContext - 它是否包含在配置XML文件中定义的bean?
查看ContextLoaderListener的代码,看起来它加载了配置XML文件中定义的数据.但我的Spring Web应用程序无需定义此侦听器或任何其他侦听器.怎么会这样?
在什么情况下有多个Spring的DispatcherServlet实例是有意义的?
根上下文(来自applicationContext.xml的数据)是否适用于DispatcherServlet的每个实例,而其他上下文(例如来自test-servlet.xml的数据)仅适用于相关的DispatcherServlet(即测试)?
当我第一次开始学习Spring时,在applicationContext.xml文件中配置了一些东西.然后当我开始专门阅读更新版本的spring时,他们都在单独的XML文件中完成了配置,例如myapp-servlet-xml,myapp-security.xml,myapp-service.xml等.在web.xml文件中配置contextConfigLocation.因此,例如,我一直关注的代码就是它的contextConfigLocation:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/myapp-servlet.xml
/WEB-INF/myapp-data.xml
</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
无论如何,最近我遇到了一个配置问题(StackOverflow的帮助人员帮助我弄清楚),这是由于这种分离.这些书中的示例没有applicationContext.xml文件,稍后当我尝试向应用程序添加自动扫描和注释时,这会导致问题.我尝试将所有内容移动到applicationContext.xml中并取消其他文件并解决了问题.没有其他改变,我只是将所有内容都放在applicationContext.xml中.
因此,这与其他人的评论一起使我有理解,即使您没有创建applicationContext.xml,它仍然被使用,并且它是某种配置层次结构的顶级.我希望其他人可以向我解释这一切是如何运作的,因为我没有在任何地方遇到任何解释.
因此,例如,如果我将某些上下文:组件扫描标记放入applicationContext.xml下面的配置文件中,则可能导致某些类无法扫描.那种性质的东西.我不明白优先级和必须去哪里确定应用程序的广泛性等等.如果有人能够清楚地解释它或指向我解释它的资源我会非常感激,谢谢.希望我所要求的是有道理的.
我有一个spring bean(dao)对象,我通过以下xml在我的ServletContext中实例化:
<bean id="userDao" class="com.company.dao.impl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
Run Code Online (Sandbox Code Playgroud)
这个bean在我的webapp-servlet.xml文件中声明,并由我的应用程序在ServletContext中使用.
我也在使用SpringSecurity.我的理解是,它在不同的上下文中运行(SecurityContext).
我的应用程序有一个webapp-security.xml,我在其中实例化一个自定义身份验证提供程序.我想使用我的应用程序中使用的我的dao也在我的安全上下文中进行用户查找,但是当我运行时:
<bean id="userAuthenticationProvider" class="com.company.security.UserAuthenticationProvider">
<property name="userDao" ref="userDao" />
</bean>
Run Code Online (Sandbox Code Playgroud)
我得到错误,说没有这样的bean"userDao".bean在我的其他上下文中声明的bean中自动装配好,但不在我的安全上下文中.根据Spring Docs,我相信web.xml中需要两个单独的上下文
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何才能访问我的SecurityContext中存在于我的ServletContext中的DAO?我的dao是否有范围修饰符,或者我可以在运行时在我的身份验证提供程序中以某种方式获取ServletContext?作为参考,这是我想在我的身份验证提供程序中使用它的方式:
public class UserAuthenticationProvider extends
AbstractUserDetailsAuthenticationProvider {
@Override
protected UserDetails retrieveUser(String userName,
UsernamePasswordAuthenticationToken authenticationToken)
throws AuthenticationException {
// use dao here
Run Code Online (Sandbox Code Playgroud)
谢谢你向我解释这个
更新:
继续我的调查,似乎我使用我的daos的DispatcherServlet是一个子上下文,安全上下文在某个更高的位置.因此,父上下文无法看到我的DispatcherServlet中的bean.我认为答案是以某种方式将我的bean声明移动到父应用程序上下文中,但我不知道如何做到这一点.这是我的web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring-*.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet> …Run Code Online (Sandbox Code Playgroud) 我有一个Spring bean的图表,它们互相自动装配.重度简化的插图:
<context:annotation-config/>
<bean class="Foo"/>
<bean class="Bar"/>
<bean class="Baz"/>
...
public class Foo {
@Autowired Bar bar;
@Autowired Baz baz;
}
public class Bar {
@Autowired Foo foo;
}
public class Baz {
@Autowired Foo foo;
}
Run Code Online (Sandbox Code Playgroud)
所有这些bean都没有指定范围,这意味着它们是单例(使它们显式单例不会改变任何东西,我已经尝试过了).
问题是在单个应用程序上下文实例化后,实例Bar和Baz包含不同的实例Foo.怎么会发生这种情况?
我试图创建public no args构造函数,Foo并且已经确认已经多次创建调试Foo.所有这些创作的堆栈跟踪都在这里.
我还尝试为Spring启用调试日志记录,并在所有其他行中获得以下内容:
DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Foo'
DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'Foo'
DEBUG …Run Code Online (Sandbox Code Playgroud) Spring Security基本示例给出了此异常.
错误:"通用匹配模式('/**')在过滤器链中的其他模式之前定义,导致它们被忽略.请检查命名空间或FilterChainProxy bean配置中的顺序"
我在同一个问题上查了很多帖子.但找不到任何解决方案.任何人都可以部署一个hello spring security吗?
我使用的是这些版本 - Spring 3.2.0.RELEASE/Spring security 3.2.0.RELEASE/Tomcat 7/Java 1.7.
这是我的代码:
web.xml中
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Spring security sample Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-context.xml,
/WEB-INF/security-context.xml</param-value>
</context-param>
<!-- Spring security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>spring-dispatcher-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-context.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring-dispatcher-servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Run Code Online (Sandbox Code Playgroud)
弹簧的context.xml
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd">
<authentication-manager>
<authentication-provider>
<user-service>
<user …Run Code Online (Sandbox Code Playgroud) 我的@Transactionnal注释似乎被忽略了.我对Spring容器的初始化没有错误.看起来我的方法还没有被Spring TX框架代理.在执行我的服务方法期间,JDBCTemplate会抛出预期的RuntimeException.问题是JDBC连接没有回滚并且更改是持久的.堆栈跟踪不显示应该包装我的服务方法的代理的任何符号.
编辑:添加了控制器的代码
编辑2:添加了服务的界面
这是我的服务界面.
public interface ApplicationsService {
public Application getApplicationById(int id);
public void createApplication(Application application);
public void createInstance(Application application);
public Map<Integer, Application> getUserApplications(String username);
public Application newApplication(String email);
}
Run Code Online (Sandbox Code Playgroud)
这是我的服务.
@Service
public class ApplicationsServiceImpl implements ApplicationsService {
...
@Transactional
public void createApplication(Application application){
// Persisting the application.
applicationDAO.createApplication(application);
application.setId(
applicationDAO.findApplicationId(application.getName(), application.getAccount().getEmail())
);
// Creating the physical instance.
createInstance(application);
}
...
}
Run Code Online (Sandbox Code Playgroud)
Spring Controller负责方法调用.
@Controller
@RequestMapping("/applications")
public class ApplicationsController {
...
@Autowired
private ApplicationsService applicationsService;
...
@RequestMapping(method=RequestMethod.POST)
public String …Run Code Online (Sandbox Code Playgroud) 我想使用ContextLoaderListener(以便我可以将Spring Beans传递给我的servlet)以及DispatchServlet(Spring MVC).但是,目前我必须将init param传递给这两个类初始值设定项:
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/app-config.xml
</param-value>
Run Code Online (Sandbox Code Playgroud)
所以,我对这两个类使用相同的xml.不知道是否会导致我的bean被初始化两次?如果是,我该怎么做才能避免这种情况?
在我看来web.xml,主要配置如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-mvc-config.xml
</param-value>
</context-param>
<filter>
<filter-name>SetCharacterEncoding</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
在我的spring-mvc-config.xml,只有2行:
<mvc:annotation-driven />
<import resource="spring.xml" />
Run Code Online (Sandbox Code Playgroud)
接下来,在我看来spring.xml,弹簧配置上有所有东西,没有关于springMVC配置的任何内容.
当我开始这个web应用程序在Tomcat中,它总是抛出FileNotFoundException的[WEB-INF /休息-servlet.xml中],之后我添加它,它只是正常工作.
我只想知道web.xml中哪个部分指示在WEB-INF目录中必须有一个rest-servlet.xml.
我用Google搜索了但却一无所获.谁能帮助我?非常感谢!
spring ×7
java ×4
spring-mvc ×3
annotations ×1
autowired ×1
java-7 ×1
jdbc ×1
rest ×1
security ×1
servlets ×1
singleton ×1
tomcat7 ×1
transactions ×1
web.xml ×1