-
context:component-scan使用说明
2013-11-14 12:43:12在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean 注意:如果配置了那么标签就可以不用再xml中...在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean
注意:如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者。另外<context:component-scan>还提供了两个子标签
1. <context:include-filter>
2. <context:exclude-filter>
在说明这两个子标签前,先说一下<context:component-scan>有一个use-default-filters属性,该属性默认为true,这就意味着会扫描指定包下的全部的标有@Component的类,并注册成bean.也就是@Component的子注解@Service,@Reposity等。所以如果仅仅是在配置文件中这么写
<context:component-scan base-package="tv.huan.weisp.web"/>
Use-default-filter此时为true那么会对base-package包或者子包下的所有的进行java类进行扫描,并把匹配的java类注册成bean。
可以发现这种扫描的粒度有点太大,如果你只想扫描指定包下面的Controller,该怎么办?此时子标签<context:incluce-filter>就起到了勇武之地。如下所示
<context:component-scan base-package="tv.huan.weisp.web .controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
这样就会只扫描base-package指定下的有@Controller下的java类,并注册成bean
但是因为use-dafault-filter在上面并没有指定,默认就为true,所以当把上面的配置改成如下所示的时候,就会产生与你期望相悖的结果(注意base-package包值得变化)
<context:component-scan base-package="tv.huan.weisp.web">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
此时,spring不仅扫描了@Controller,还扫描了指定包所在的子包service包下注解@Service的java类
此时指定的include-filter没有起到作用,只要把use-default-filter设置成false就可以了。这样就可以避免在base-packeage配置多个包名这种不是很优雅的方法来解决这个问题了。
另外在我参与的项目中可以发现在base-package指定的包中有的子包是不含有注解了,所以不用扫描,此时可以指定<context:exclude-filter>来进行过滤,说明此包不需要被扫描。综合以上说明
Use-dafault-filters=”false”的情况下:<context:exclude-filter>指定的不扫描,<context:include-filter>指定的扫描
-
-
@Component注解的含义
2017-05-04 15:41:20“无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。...4、@component (把普通pojo实例化到spring容...“无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点人工智能教程可以跳转到教程。
一、注解分类
1、@controller: controller控制器层(注入服务)
2、@service : service服务层(注入dao)
3、@repository : dao持久层(实现dao访问)
4、@component: 标注一个类为Spring容器的Bean,(把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)二、@Component 注解含义
@Component: 标注Spring管理的Bean,使用@Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean。
三、基于@Component扩展的注解
@Repository:
@Component注解的扩展,被@Repository注解的POJO类表示DAO层实现,从而见到该注解就想到DAO层实现,使用方式和@Component相同;
@Service:
@Component注解的扩展,被@Service注解的POJO类表示Service层实现,从而见到该注解就想到Service层实现,使用方式和@Component相同;
@Controller:
@Component注解的扩展,被@Controller注解的类表示Web层实现,从而见到该注解就想到Web层实现,使用方式和@Component相同;
Tips: 使用@Component,@Service,@Controller,@Repository注解的类,表示把这些类纳入到spring容器中进行管理,同时也是表明把该类标记为Spring容器中的一个Bean。
四、component的扫描组件下面写这行配置是引入component的扫描组件
<context:component-scan base-package=”com.mmnc”>
其中base-package为指定需要扫描的包(含所有子包) ,扫描被@Service、@Controller、@Repository、@Component等注解标注的Java类,将其扫描注入到Spring容器,注入成Bean:
- @Service用于标注业务层组件
- @Controller用于标注控制层组件(如struts中的action)
- @Repository用于标注数据访问组件,即DAO组件.
- @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注,标识为一个Bean。
五、方法初始化和销毁
从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解: @PostConstruct和@PreConstruct ,这两个注解被用来修饰一个非静态的void()方法,而且这个方法不能有抛出异常声明,标注方法的初始化和销毁,当你需要在系统启动时提前设置一下变量或者设置值操作时,可以使用@PostConstruct注解进行项目启动时设置来完成,当你需要处理关闭资源或者发送通知相关操作时可以使用@PreConstruct 完成。
1. @PostConstruct注解
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
2. @PreDestroy注解
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
加载顺序如图:
在Spring中可以使用以下方式指定初始化方法和销毁方法(方法名任意)://对象创建并赋值之后调用 @PostConstruct public void init() { System.out.println("对象创建并赋值之后调用..."); }
和
//容器移除对象之前 @PreDestroy public void detory(){ System.out.println("容器移除对象之前执行..."); }
3. 示例
@Controller @Lazy(false) public class ServletInit { @Autowired private PCASigninServlet pcaSigninServlet; @Autowired private PCASignoutServlet pcaSignoutServlet; @Autowired private PCAInitServlet pcaInitServlet; @Autowired private PCALogoutServlet pcaLogoutServlet; @Autowired private PCAInfoServlet pcaInfoServlet; @Autowired private HelloServlet helloServlet; @Autowired @Qualifier("handler") private WebAppContext webapp; @PostConstruct void init(){ Server server = new Server(8848); ServletContextHandler contextHander = new ServletContextHandler(ServletContextHandler.SESSIONS); contextHander.setContextPath("/"); System.out.println("start init"); HandlerCollection hc =new HandlerCollection(); hc.setHandlers(new Handler[]{webapp, contextHander}); server.setHandler(hc); System.out.println("addServlet /hello"); contextHander.addServlet(new ServletHolder(helloServlet), "/hello"); contextHander.addServlet(new ServletHolder( pcaSigninServlet), "/pca/signin"); contextHander.addServlet(new ServletHolder( pcaSignoutServlet), "/pca/signout"); contextHander.addServlet(new ServletHolder( pcaInitServlet), "/pca/init"); contextHander.addServlet(new ServletHolder( pcaLogoutServlet), "/pca/logout"); contextHander.addServlet(new ServletHolder( pcaInfoServlet), "/pca/info"); try { System.out.println("server start"); server.start(); server.join(); System.out.println("server stop"); } catch (Exception e) { e.printStackTrace(); } } }
-
【Spring基础】Failed to read candidate component class错误分析
2016-11-01 20:18:02- JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning - Context initialization failed org.springframework.beans.factory.BeanDefinitionStoreException: Failed to rea错误信息:
- JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning - Context initialization failed org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [E:\gold_work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\gold_public\WEB-INF\classes\com\golddashi\base\thirdpay\rongbao\configure\RBService.class]; nested exception is org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [E:\gold_work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\gold_public\WEB-INF\classes\com\golddashi\base\thirdpay\rongbao\configure\RBService.class]; nested exception is java.lang.IllegalArgumentException at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:290) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242) at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84) at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:185) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4994) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [E:\gold_work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\gold_public\WEB-INF\classes\com\golddashi\base\thirdpay\rongbao\configure\RBService.class]; nested exception is java.lang.IllegalArgumentException at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:56) at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80) at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102) at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:266) ... 32 more Caused by: java.lang.IllegalArgumentException at org.springframework.asm.ClassReader.<init>(Unknown Source) at org.springframework.asm.ClassReader.<init>(Unknown Source) at org.springframework.asm.ClassReader.<init>(Unknown Source) at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:53) ... 35 more 十一月 01, 2016 7:55:49 下午 org.apache.catalina.core.StandardContext listenerStart 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [E:\gold_work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\gold_public\WEB-INF\classes\com\golddashi\base\thirdpay\rongbao\configure\RBService.class]; nested exception is org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [E:\gold_work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\gold_public\WEB-INF\classes\com\golddashi\base\thirdpay\rongbao\configure\RBService.class]; nested exception is java.lang.IllegalArgumentException at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:290) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242) at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84) at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:185) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4994) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [E:\gold_work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\gold_public\WEB-INF\classes\com\golddashi\base\thirdpay\rongbao\configure\RBService.class]; nested exception is java.lang.IllegalArgumentException at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:56) at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80) at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102) at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:266) ... 32 more Caused by: java.lang.IllegalArgumentException at org.springframework.asm.ClassReader.<init>(Unknown Source) at org.springframework.asm.ClassReader.<init>(Unknown Source) at org.springframework.asm.ClassReader.<init>(Unknown Source) at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:53) ... 35 more 十一月 01, 2016 7:55:49 下午 org.apache.catalina.core.StandardContext startInternal 严重: Error listenerStart 十一月 01, 2016 7:55:49 下午 org.apache.catalina.core.StandardContext startInternal 严重: Context [/gold_public] startup failed due to previous errors 十一月 01, 2016 7:55:49 下午 org.apache.catalina.core.ApplicationContext log 信息: Closing Spring root WebApplicationContext - Closing Root WebApplicationContext: startup date [Tue Nov 01 19:55:49 GMT+08:00 2016]; root of context hierarchy - Exception thrown from ApplicationListener handling ContextClosedEvent java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: Root WebApplicationContext: startup date [Tue Nov 01 19:55:49 GMT+08:00 2016]; root of context hierarchy at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:347) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:334) at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1049) at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1010) at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:559) at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:143) at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5035) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5687) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) - Exception thrown from LifecycleProcessor on context close java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: Root WebApplicationContext: startup date [Tue Nov 01 19:55:49 GMT+08:00 2016]; root of context hierarchy at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:360) at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1057) at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1010) at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:559) at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:143) at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5035) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5687) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 十一月 01, 2016 7:55:49 下午 org.apache.catalina.core.StandardContext listenerStop 严重: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:171) at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1090) at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1064) at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1010) at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:559) at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:143) at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5035) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5687) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
将spring从3.1升级到3.2启动tomcat出现如上错误,
仔细检查过web.xml中关于spring配置引入,spring-mvc配置引入都没有问题,
以及spring配置文件读取方式,包括监听参数配置也是对的,
关于引入和监听web.xml配置如下:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring/applicationContext-spring-rmi-client.xml, classpath:spring/spring-context.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener>
换回成3.1又没有问题,换成3.2又不行,查看编译环境用的是1.8,将1.8降为1.7,问题解决,服务启动正常,
也就是说spring 3.2不支持1.8编译环境,解决办法就是降为1.7编译环境
关于编译环境配置如图:
spring官网说了,要使用java8,只支持spring 4.X以上版本,而spring的使用最低java要求java5及以上,
如果出现例外,那就例外说了,比如一开始spring 3.1就可以在java8上编译。
-
-
Component和PureComponent的区别
2019-02-23 17:35:58文章目录Component和PureComponent的区别介绍区别点:PureComponent缺点PureComponent优势为什么PureComponent比较复杂的数据结构,可能会因深层的数据不一致而产生错误的否定判断? ReactNative系列-文章 Component...文章目录
ReactNative系列-文章Component和PureComponent的区别
介绍
React.PureComponent 与 React.Component 几乎完全相同,但 React.PureComponent 通过props和state的浅对比来实现 shouldComponentUpate()。
在PureComponent中,如果包含比较复杂的数据结构,可能会因深层的数据不一致而产生错误的否定判断,导致界面得不到更新。
如果定义了 shouldComponentUpdate(),无论组件是否是 PureComponent,它都会执行shouldComponentUpdate结果来判断是否 update。如果组件未实现 shouldComponentUpdate() ,则会判断该组件是否是 PureComponent,如果是的话,会对新旧 props、state 进行 shallowEqual 比较,一旦新旧不一致,会触发 update。
浅对比:通过遍历对象上的键执行相等性,并在任何键具有参数之间不严格相等的值时返回false。 当所有键的值严格相等时返回true。shallowEqual
区别点:
- PureComponent自带通过props和state的浅对比来实现 shouldComponentUpate(),而Component没有。
PureComponent缺点
- 可能会因深层的数据不一致而产生错误的否定判断,从而shouldComponentUpdate结果返回false,界面得不到更新。
PureComponent优势
- 不需要开发者自己实现shouldComponentUpdate,就可以进行简单的判断来提升性能。
为什么PureComponent比较复杂的数据结构,可能会因深层的数据不一致而产生错误的否定判断?
JavaScript 中的对象一般是可变的(Mutable),因为使用了引用赋值,新的对象简单的引用了原始对象,改变新的对象将影响到原始对象。如 foo={a: 1}; bar=foo; bar.a=2 你会发现此时 foo.a 也被改成了 2。
为了解决这个问题,一般的做法是使用 shallowCopy(浅拷贝)或 deepCopy(深拷贝)来避免被修改,但这样做造成了 CPU 和内存的浪费。
let foo = {a: {b: 1}}; let bar = foo; bar.a.b = 2; console.log(foo.a.b); // 打印 2 console.log(foo === bar); // 打印 true
可以在fb的shallowEqual方法源码中看到,如下,浅对比只是用Object.is()对Object的value做了一个基本数据类型的比较。
function is(x: mixed, y: mixed): boolean { // SameValue algorithm if (x === y) { // Steps 1-5, 7-10 // Steps 6.b-6.e: +0 != -0 // Added the nonzero y check to make Flow happy, but it is redundant return x !== 0 || y !== 0 || 1 / x === 1 / y; } else { // Step 6.a: NaN == NaN return x !== x && y !== y; } } function shallowEqual(objA: mixed, objB: mixed): boolean { if (is(objA, objB)) { return true; } if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { return false; } const keysA = Object.keys(objA); const keysB = Object.keys(objB); if (keysA.length !== keysB.length) { return false; } // Test for A's keys different from B. for (let i = 0; i < keysA.length; i++) { if ( !hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]]) ) { return false; } } return true; }
我们先来对is()函数进行分析:
在js中 ‘===’ 可以判断数据类型是否相等,但其实这样方式也并不十分严谨,例如
+0 === -0; // js 打印true NaN === NaN; // js 打印false
我们希望上述的判断结果,+0和-0为false,NaN与NaN为true,这时候可以用这种方式
1/+0 // 结果为Infinity 1/-0 // 结果为-Infinity Infinity === -Infinity; // false 解决 NaN === NaN为false,可以通过NaN和自身不相等的特性来解决 x !== x && y !== y
所以is()函数首先是通过 ‘===’ 来对数据类型进行比较,然后解决+0/-0和NaN的比较问题。
接下来分析shallowEqual()函数
function shallowEqual(objA: mixed, objB: mixed): boolean { // 首先对两个基本数据类型进行比较 if (is(objA, objB)) { return true; } // 判断两个数据都为object的情况 if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { return false; } // 获得所有的key const keysA = Object.keys(objA); const keysB = Object.keys(objB); // 判断两者key的数量是否一致 if (keysA.length !== keysB.length) { return false; } // 如果key数量相同,使用一层for循环去比较 for (let i = 0; i < keysA.length; i++) { if ( // 判断对象B中是否包含对象A的key,即两者的keys是否一致 !hasOwnProperty.call(objB, keysA[i]) || // 通过is()函数对比A和B的key对应的数据 !is(objA[keysA[i]], objB[keysA[i]]) ) { return false; } }
下面以组件的使用来举例:
例如:
class ChildComponent extends React.PureComponent { render() { return( <div> {this.props.numbers} </div> ) } } class MainComponent extends React.Component { constructor(props) { super(props); this.handleClick = this.handleClick.bind(this); this.state = { numbers: [0] } } handleClick() { const arr = this.state.numbers; arr.push(1); this.setState({ numbers: arr }) console.log(this.state.numbers) } render() { <div> <button onClick={this.handleClick} /> <ChildComponent numbers={this.state.numbers}/> </div> } }
然而在MainComponent中去修改numbers时,ChildComponent并没有得到刷新。原因在于js使用的是引用赋值,新的对象简单引用了原始对象,改变新对象虽然影响了原始对象,但对象的地址还是一样,使用===比较的方式相等。而在PureComponent中,会被判定prop相等而不触发render()。
避免此类问题最简单的方式是,避免使用值可能会突变的属性或状态,而是使用副本来返回新的变量。
handleClick() { this.setState(prevState => ({ words: [...prevState.words, 'marklar'], })); };
另外一种方式是使用Immutable.js
-
AngularJS Component详解
2017-02-06 15:11:09而在angular1.5的版本之前,都是以directive作为组件化的形式,而directive并不能很好的承担这一个职责,所以google在angular1.5的版本中推出了component组件,用于承担应用之中组件化开发的重担,那么component到底... -
@component
2019-11-01 15:36:104、@component (把普通pojo实例化到spring容器中,相当于配置文件中的 ) 泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类 ... -
解决:Unknown custom element: <myData> - did you register the component correctly? For recursive ...
2019-01-03 09:23:31- did you register the component correctly? For recursive components, make sure to provide the "name" option. 2. 原因是注册方式写重了: 3. 更正写法后,这个报错消失。... -
PureComponent与Component的区别
2019-06-27 11:17:49PureComponent PureComponent是组件开发中的重要概念,组件开发人员需要深度理解相关概念。 组件:里面写的是html PureComponent大组件big PureComponent 大组件big PureComponent里面有三个小组件:小组件a、小组件b... -
React Native之组件Component与PureComponent
2018-05-18 13:32:47众所周知,React Native的页面元素是由...通常在封装组件的时候都会继承Component,不过在React 15.3版本中系统提供了PureComponent,下面就来看一下这两个组件的区别。 首先声明,PureComponent是Component的一个... -
react中Component和PureComponent比较
2018-12-31 14:12:55import React, { PureComponent } from 'react'; class App extends PureComponent {} import React, { Component } from 'react'; class App extends Component {} PureCompoent是一个更具性能的Component的版本 ... -
Component属性
2016-06-29 21:28:54Component属性 -
@Component
2019-07-03 13:22:57@Component注解的解析 今天在写程序的时候看见一个以前没有见过的注解(@Component),在网上查找过后,经过实践,决定把它记录下来。 1、@controller 控制器(注入服务) 用于标注控制层,相当于struts中的... -
Vue报错—— Unknown custom element: [v-table] - did you register the component correctly......
2019-04-25 15:32:08今天怂怂就为大家分享一篇如何解决自定义了一个组件vTable,在nationsjgx-detailInfo.vue中页面中使用vTable组件提示: ... - did you register the component correctly? For recursive components, make sure to p... -
Spring中@Component的作用
2017-11-17 10:23:43@controller 、@servies、@respository、@Component -
React中Component与PureComponent的区别
2019-03-17 13:30:37Component是React App的基本构建的单位,也是React中的基本代码复用单位。PureComponent与Component在除了其shouldComponentUpdate方法的实现之外几乎完全相同。PureComponent已经替我们实现了shouldComponentUpdate... -
React中PureComponent和Component异同
2019-01-09 21:17:59它们几乎完全相同,但是PureComponent通过prop和state的浅比较来实现shouldComponentUpdate,某些情况下可以用PureComponent提升性能 所谓浅比较(shallowEqual),即react源码中的一个函数,然后根据下面的方法进行... -
-
Ember component
2017-02-20 15:10:39component顾名思义,是ember中的组件。其特性为可以重复利用。component也是由两部分组成,一个handlebars的模板文件以及一个js文件。其中模板文件控制如何渲染,js文件控制它的行为。组件的定义类似的,定义... -
component使用
2019-09-07 18:08:00Component内置组件的使用:用于动态切换组件 一:局部注册组件 对于引入的子组件: 定义组件1: <template> <div>这是one组件</div> </template> <script> export default... -
Spring中@component的使用
2019-06-09 21:47:32Spring中@component的使用 @component是spring中的一个注解,它的作用就是实现bean的注入,@component取代。在探究@component前先了解一下注解?何为注解?注解本质上就是一个类,开发中我们可以使用注解 取代 xml... -
MX Component 4 安装包
2013-05-28 13:22:21MX Component 4 安装包 -
ComponentOne Studio for WinForms基础课程
2014-11-29 14:01:15ComponentOne Studio for WinForms 入门教程视频主要介绍ComponentOne控件产品的基本使用方法,非常适合.NET Winform界面程序。包括界面导航与布局、业务数据交互、数据分析与可视化、报表生成和文档转换等内容。 ... -
React-class component 和 function component 的区别
2020-02-04 12:17:251、function component: function aa(props) { return <h1>this is {props.name}</h1> } 2、class component: class bb extends React.Component { render() { const { name } = this.props; ... -
Component排序
2018-02-24 17:25:26方法一当一个interface,有多个实现的时候,这些实现需要按照顺序执行的话,实现方法如下:@Component @Order(Integer.MIN_VALUE) public class ImoocAuthorizeConfigProvider implements AuthorizeConfigProvider {... -
System.ComponentModel.Component入门
2016-02-15 12:23:08我们经常看见许多.NET的Class是从System.ComponentModel.Component继承过来的,他实现了System.ComponentModel.IComponent接口,而且MS也在Visual Studio .NET中,推荐你经常使用System.ComponentModel.Component...
-
Python专题精讲 Json的应用
-
怪癖::sparkles::octopus:适用于iOS和Android的GPL许可的认知行为疗法应用程序-源码
-
jss:Sitecore JavaScript服务的正式回购-源码
-
算法导论(基础知识)——编程大牛的必经之路
-
Python语言编程高级精讲课 从程序员到架构师的必修课
-
Java 11核心技术简明视频教程
-
WPF_CommandTest2.rar
-
Spring Boot2.X仿朋友圈PC版系统实战_架构1.0
-
设计模式:用不同的编程语言编写的设计模式-源码
-
PHP 开发入门自动化测试历程(二)
-
商业的本质——杰克·韦尔奇著
-
dokit:基于Spring Boot2,Jpa,Spring Security,JWT,redis,Vue的前分离分离的后台管理系统开发平台,用户管理,菜单管理,角色管理,字典管理,权限控制的方式为RBAC,操作日志,异常日志,接口限流,项目支持数据权限管理,支持一键生成前代码(支持在线预览及打包下载),支持前端菜单动态路由可一键部署服务器应用,数据库。系统中活跃用户状态监控,监视当前系统CPU,内存,磁盘,磁盘等相关信息,基于元素UI在线表单设计及生成Vue代码-源码
-
hr:终端的水平-源码
-
转行做IT-第9章 常用类-Scanner、Random等
-
Python专题精讲 企业级应用日志管理
-
微信支付V3版微信小程序支付JAVA版
-
PHP支付宝微信支付配置教程
-
一种有效的Web服务聚类方法
-
滑动验证码被破解怎么办?
-
基于内容的民族音乐检索模型构建与实现