- 浏览: 256937 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
qingtingchen:
请问下如果只有uid/emial 和密码的话要怎样进行认证
【总结】Spring LDAP整理 -
cylboke:
太给力了,搞了一下午,一直换jar版本,不起作用,用楼主的方法 ...
【学习】spring MVC之返回JSON数据(Spring3.0 MVC+Jackson+AJAX) -
hu3625067:
楼主写的很精辟,言简意赅,非常实用
【总结】Spring LDAP整理 -
hu3625067:
写的很精辟,很实用
【总结】Quartz整理 -
Mr小血:
找了好久,终于找到解决办法了,谢谢
formvalidator4.1.3 - 校验时不能自定义向后台传值的BUG问题
Spring mvc3中的<context:annotation-config>和<context:component-scan>到底什么区别呢?平时是不是都在混用?今天看到一篇很不错的问答,解释的非常好。
原文地址如下:http://stackoverflow.com/questions/7414794/difference-between-contextannotation-config-vs-contextcomponent-scan
<context:annotation-config> 是用来激活已经在spring配置文件applicationContext.xml中注册过的bean(不管这个bean是在xml中定义的,还是包含在扫描包中的)。
<context:component-scan> 能做<context:annotation-config>所能做的事,除此之外,<context:component-scan>还能找到并注册在applicationContext.xml中配置的bean。
这么说很抽象,激活和注册的具体概念和区别又是什么呢?下面用一些小例子来说明个中的相同点和不同点。
现在有三个bean,A,B和C。类A中还注入了bean B和bean C。
在XML中配置如下:
启动项目后输出如下:
这是我们想要的结果,但是这种方式太老旧了,接下来我们要用注释来代过段时间上述的xml配置。
首先,在类A中,我们加入@Autowired标签来注入属性bbb和ccc。如下:
这样我们就可以删除在xml中bean A中的property(属性)了。
所以xml可以简化成如下:
当我启动修改后的项目后,得到的输出如下:
有没有发现,跟我们预想的不一样,中间出了错(在类A中没有成功设值bean B和bean C)。
注释确实是个很方便的技术,但到目前为止,它们还没有发挥出功效。它们如同待执行的任务一样,需要有一个好的工具去找到它们并且让它们能真正的启动起来。
标签<context:annotation-config>就是派来解救注解的。此话怎讲呢,这个标签可以找到那些在applicationContext中定义过的bean的注解。
由此,将xml改为:
重启项目,结果如预期所想:
第二种方案看起来不错,但我删掉了两行xml的同时,又必须再加上一行。看起来不是一个大改动。注解的思想应该是需要删除掉xml配置才对。于是我们接着把定义bean的xml用注释来代替:
这样的话,xml就只剩下:
启动项目,看看输出结果,结果就是空白,没有任何的输出。这意味着没有bean被标签autowired激活了,这样的结果出乎意料。
就如同文章一开始提到的,标签<context:annotation-config />的作用对象权权是那些已经在applicationContext中定义过的bean(但并没有激活)。当我们把三个定义的bean的xml语句移掉后,标签<context:annotation-config />就找不到“目标”了。
但这个问题并不存在于标签<context:component-scan>中,标签<context:component-scan>可以扫描指定的java包,找到“目标”。(就算bean没有在xml中定义也没关系)。
我们将xml中的配置修改如下:
启动项目,得到了如下的输出:
好像少了类A的加载,为什么呢?
如果我们仔细观察这些类,会发现类A的java包是com.yyy,并不是标签<context:component-scan>中定义的com.xxx,所以这才是为什么漏掉整个A类的加载的原因。
为了修补这个bug,我们将base-package修改如下:
如同魔术般的,得到预期结果:
至此,我们完成了符合注释风格的代码。
题外话,如果我们执意将base-package只定义为com.xxx,那有没有办法做到对类A的加载呢?那必须定义bean A。
这样定义的话,我们依然能得到正确的结果:
尽管类A并没有包含在扫描的java包中,标签<context:component-scan>还是会找到所有在applicationContext.xml中定义的其它所有bean(就像手动定义的beanA)。
那么,当我们在一个xml中同时配置标签<context:annotation-config />和<context:component-scan>,会发生什么呢?如下的配置会让类A重复加载吗?
答案是否。我们得到的结果依然如下:
这是因为如果两个标签同时存在的时候,标签<context:annotation-config />会被忽略。
甚至当你定义同一个bean很多次,Spring总是能确保它们只会被加载一次,如下:
结果依然一样:
原文地址如下:http://stackoverflow.com/questions/7414794/difference-between-contextannotation-config-vs-contextcomponent-scan
<context:annotation-config> 是用来激活已经在spring配置文件applicationContext.xml中注册过的bean(不管这个bean是在xml中定义的,还是包含在扫描包中的)。
<context:component-scan> 能做<context:annotation-config>所能做的事,除此之外,<context:component-scan>还能找到并注册在applicationContext.xml中配置的bean。
这么说很抽象,激活和注册的具体概念和区别又是什么呢?下面用一些小例子来说明个中的相同点和不同点。
现在有三个bean,A,B和C。类A中还注入了bean B和bean C。
package com.xxx; public class B { public B() { System.out.println("creating bean B: " + this); } } package com.xxx; public class C { public C() { System.out.println("creating bean C: " + this); } } package com.yyy; import com.xxx.B; import com.xxx.C; public class A { private B bbb; private C ccc; public A() { System.out.println("creating bean A: " + this); } public void setBbb(B bbb) { System.out.println("setting A.bbb with " + bbb); this.bbb = bbb; } public void setCcc(C ccc) { System.out.println("setting A.ccc with " + ccc); this.ccc = ccc; } }
在XML中配置如下:
<bean id="bBean" class="com.xxx.B" /> <bean id="cBean" class="com.xxx.C" /> <bean id="aBean" class="com.yyy.A"> <property name="bbb" ref="bBean" /> <property name="ccc" ref="cBean" /> </bean>
启动项目后输出如下:
creating bean B: com.xxx.B@c2ff5 creating bean C: com.xxx.C@1e8a1f6 creating bean A: com.yyy.A@1e152c5 setting A.bbb with com.xxx.B@c2ff5 setting A.ccc with com.xxx.C@1e8a1f6
这是我们想要的结果,但是这种方式太老旧了,接下来我们要用注释来代过段时间上述的xml配置。
首先,在类A中,我们加入@Autowired标签来注入属性bbb和ccc。如下:
package com.yyy; import org.springframework.beans.factory.annotation.Autowired; import com.xxx.B; import com.xxx.C; public class A { private B bbb; private C ccc; public A() { System.out.println("creating bean A: " + this); } @Autowired public void setBbb(B bbb) { System.out.println("setting A.bbb with " + bbb); this.bbb = bbb; } @Autowired public void setCcc(C ccc) { System.out.println("setting A.ccc with " + ccc); this.ccc = ccc; } }
这样我们就可以删除在xml中bean A中的property(属性)了。
<property name="bbb" ref="bBean" /> <property name="ccc" ref="cBean" />
所以xml可以简化成如下:
<bean id="bBean" class="com.xxx.B" /> <bean id="cBean" class="com.xxx.C" /> <bean id="aBean" class="com.yyy.A" />
当我启动修改后的项目后,得到的输出如下:
creating bean B: com.xxx.B@5e5a50 creating bean C: com.xxx.C@54a328 creating bean A: com.yyy.A@a3d4cf
有没有发现,跟我们预想的不一样,中间出了错(在类A中没有成功设值bean B和bean C)。
注释确实是个很方便的技术,但到目前为止,它们还没有发挥出功效。它们如同待执行的任务一样,需要有一个好的工具去找到它们并且让它们能真正的启动起来。
标签<context:annotation-config>就是派来解救注解的。此话怎讲呢,这个标签可以找到那些在applicationContext中定义过的bean的注解。
由此,将xml改为:
<context:annotation-config /> <bean id="bBean" class="com.xxx.B" /> <bean id="cBean" class="com.xxx.C" /> <bean id="aBean" class="com.yyy.A" />
重启项目,结果如预期所想:
creating bean B: com.xxx.B@15663a2 creating bean C: com.xxx.C@cd5f8b creating bean A: com.yyy.A@157aa53 setting A.bbb with com.xxx.B@15663a2 setting A.ccc with com.xxx.C@cd5f8b
第二种方案看起来不错,但我删掉了两行xml的同时,又必须再加上一行。看起来不是一个大改动。注解的思想应该是需要删除掉xml配置才对。于是我们接着把定义bean的xml用注释来代替:
package com.xxx; import org.springframework.stereotype.Component; @Component public class B { public B() { System.out.println("creating bean B: " + this); } } package com.xxx; import org.springframework.stereotype.Component; @Component public class C { public C() { System.out.println("creating bean C: " + this); } } package com.yyy; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.xxx.B; import com.xxx.C; @Component public class A { private B bbb; private C ccc; public A() { System.out.println("creating bean A: " + this); } @Autowired public void setBbb(B bbb) { System.out.println("setting A.bbb with " + bbb); this.bbb = bbb; } @Autowired public void setCcc(C ccc) { System.out.println("setting A.ccc with " + ccc); this.ccc = ccc; } }
这样的话,xml就只剩下:
<context:annotation-config />
启动项目,看看输出结果,结果就是空白,没有任何的输出。这意味着没有bean被标签autowired激活了,这样的结果出乎意料。
就如同文章一开始提到的,标签<context:annotation-config />的作用对象权权是那些已经在applicationContext中定义过的bean(但并没有激活)。当我们把三个定义的bean的xml语句移掉后,标签<context:annotation-config />就找不到“目标”了。
但这个问题并不存在于标签<context:component-scan>中,标签<context:component-scan>可以扫描指定的java包,找到“目标”。(就算bean没有在xml中定义也没关系)。
我们将xml中的配置修改如下:
<context:component-scan base-package="com.xxx" />
启动项目,得到了如下的输出:
creating bean B: com.xxx.B@1be0f0a creating bean C: com.xxx.C@80d1ff
好像少了类A的加载,为什么呢?
如果我们仔细观察这些类,会发现类A的java包是com.yyy,并不是标签<context:component-scan>中定义的com.xxx,所以这才是为什么漏掉整个A类的加载的原因。
为了修补这个bug,我们将base-package修改如下:
<context:component-scan base-package="com.xxx,com.yyy" />
如同魔术般的,得到预期结果:
creating bean B: com.xxx.B@cd5f8b creating bean C: com.xxx.C@15ac3c9 creating bean A: com.yyy.A@ec4a87 setting A.bbb with com.xxx.B@cd5f8b setting A.ccc with com.xxx.C@15ac3c9
至此,我们完成了符合注释风格的代码。
题外话,如果我们执意将base-package只定义为com.xxx,那有没有办法做到对类A的加载呢?那必须定义bean A。
<context:component-scan base-package="com.xxx" /> <bean id="aBean" class="com.yyy.A" />
这样定义的话,我们依然能得到正确的结果:
creating bean B: com.xxx.B@157aa53 creating bean C: com.xxx.C@ec4a87 creating bean A: com.yyy.A@1d64c37 setting A.bbb with com.xxx.B@157aa53 setting A.ccc with com.xxx.C@ec4a87
尽管类A并没有包含在扫描的java包中,标签<context:component-scan>还是会找到所有在applicationContext.xml中定义的其它所有bean(就像手动定义的beanA)。
那么,当我们在一个xml中同时配置标签<context:annotation-config />和<context:component-scan>,会发生什么呢?如下的配置会让类A重复加载吗?
<context:annotation-config /> <context:component-scan base-package="com.xxx" /> <bean id="aBean" class="com.yyy.A" />
答案是否。我们得到的结果依然如下:
creating bean B: com.xxx.B@157aa53 creating bean C: com.xxx.C@ec4a87 creating bean A: com.yyy.A@1d64c37 setting A.bbb with com.xxx.B@157aa53 setting A.ccc with com.xxx.C@ec4a87
这是因为如果两个标签同时存在的时候,标签<context:annotation-config />会被忽略。
甚至当你定义同一个bean很多次,Spring总是能确保它们只会被加载一次,如下:
<context:annotation-config /> <context:component-scan base-package="com.xxx" /> <bean id="aBean" class="com.yyy.A" /> <bean id="bla" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> <bean id="bla1" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> <bean id="bla2" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> <bean id="bla3" class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
结果依然一样:
creating bean B: com.xxx.B@157aa53 creating bean C: com.xxx.C@ec4a87 creating bean A: com.yyy.A@25d2b2 setting A.bbb with com.xxx.B@157aa53 setting A.ccc with com.xxx.C@ec4a87
发表评论
-
【总结】Java日志类工具整理
2017-09-25 21:01 735关于Java日志的总结,知 ... -
《软技能——代码之外的生存指南》阅读整理
2017-03-09 23:10 1189本书的原版叫《Soft Skill ... -
吴军《数学之美》第二版阅读整理
2017-03-07 22:34 7154吴军的《数学之美》第一版于2012年出版,并获得国家图书馆第八 ... -
O'Reilly出版《微服务设计》阅读整理
2017-02-26 16:49 1758《微服务设计》原版是O'Reilly Media, Inc在2 ... -
Maven技术书之《Maven实战》阅读整理
2017-02-20 21:04 1061Maven是一个实用且优秀的构建工具,我之于Maven只能算入 ... -
【总结】Hazelcast之Distributed Map介绍(续)
2016-12-22 21:49 0目录: 1. Distributed Map ... -
【总结】Hazelcast之Distributed Map介绍
2016-12-19 22:21 2732通过Hazelcast入门简介(http://angelbil ... -
【总结】Matlab调用Java代码
2016-11-07 22:46 2518Matlab调用Java代码,这个比较简单,步骤如下: 1. ... -
【翻译】运用MapReduce找到社交媒体中的共同朋友
2016-10-22 16:24 710原文:http://stevekrenzel.co ... -
【总结】Spring LDAP整理
2016-08-29 21:53 11715如果要总结Spring的LDAP(Spring开发的操作LDA ... -
【总结】Quartz整理
2016-08-28 14:00 1358官网:http://www.quartz-schedule ... -
【总结】Java基础之String
2016-03-26 15:46 0总结关于String的问题和特点。 1、contains() ... -
【总结】java.util.Date vs. java.sql.Date
2016-03-19 21:06 1728本文总结了java.util.Date和java.sql.Da ... -
【总结】Java基础之Set:HashSet vs. LinkedHashSet vs. TreeSet
2016-02-28 17:24 1757总结平时常用的Collection子接口:Set接口以及其实现 ... -
【总结】Java基础之List:ArrayList vs. LinkedList vs. Vector
2016-02-27 17:41 909总结平时常用的Collection ... -
【总结】Java基础之Map:HashMap vs. LinkedHashMap vs. TreeMap vs. ConcurrentHashMap
2016-02-21 18:17 2394Map是Java最常用的集合类之一。它有很多实现类,我总结了几 ... -
【总结】正则表达式
2016-01-09 15:13 838正则表达式(Regular Expre ... -
【总结】Redis Vs Hazelcast
2015-11-04 22:36 0Redis官网:http://redis.io ----- ... -
【总结】servlet mapping url 配置中的 / 和 /* 的区别
2015-03-28 16:48 1958web.xml的配置中,关于<url-pattern&g ... -
aaasdasd
2015-02-06 15:30 0http://www.quartz-scheduler.org ...
相关推荐
2. **XML配置问题**:确保你的Spring配置文件(如`applicationContext.xml`)正确包含了`<context:component-scan>`或`<context:annotation-config>`元素,它们是启用注解配置的关键。 3. **编译器设置**:检查你的...
<context:annotation-config /> ``` 这将隐式地向 Spring 容器注册 `AutowiredAnnotationBeanPostProcessor`、`CommonAnnotationBeanPostProcessor`、`PersistenceAnnotationBeanPostProcessor` 和 `...
<context:annotation-config /> <context:component-scan base-package="com.mvc.*"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component...
在这个主题中,我们将深入探讨`<context:annotation-config>`与`<context:component-scan>`的区别,事务管理器的配置,以及Spring开发环境的选择和数据源的配置。 1. `<context:annotation-config>`和`<context:...
2. `<context:component-scan>`: - 这个元素告诉Spring扫描指定包及其子包,寻找带有`@Controller`注解的类,并将它们作为bean进行管理。 3. `<mvc:annotation-driven>`(通常也会包含,但此处未提供): - 这个...
在上面的配置文件中,我们使用了 `<context:annotation-config/>` 和 `<context:component-scan base-package="testspring.main"/>` 两个标签。 `<context:annotation-config/>` 用于启用注释型的 IOC,而 `<context...
<context:component-scan base-package="org.whvcse"></context:component-scan> <tx:annotation-driven transaction-manager="txManager" /> <!-- <aop:config> <aop:pointcut id="defaultServiceOperation" ...
在这个配置中,`<context:component-scan>`用于自动扫描指定包下的类,发现`@Repository`、`@Service`等注解并进行注册。`<context:annotation-config>`启用对注解的处理,使得我们可以使用`@Transactional`注解来...
`<context:component-scan>`元素用于指定需要扫描的包,这样Spring会自动发现这些包下标记了如`@Component`、`@Service`、`@Repository`等注解的类,并将它们注册为Bean。 接着,我们看DAO层的配置。使用`@...
此外,`<context:annotation-config>`和`<context:component-scan>`分别用于启用注解驱动和扫描特定包下的@Component注解。 6. **基于Java注解装载配置元信息**:Java配置类通过`@Configuration`、`@Bean`等注解...
在上面的配置文件中,我们使用了 `<context:annotation-config/>` 和 `<context:component-scan>` 两个元素。`<context:annotation-config/>` 元素用于激活注解驱动的 Bean, `<context:component-scan>` 元素用于...
它包括了如`<context:component-scan>`、`<context:annotation-config>`等元素,使得我们可以方便地启用注解驱动的配置和组件扫描,发现并自动装配带有特定注解的类。此外,它还支持消息源、AOP代理、事件监听等特性...
在Spring中,包扫描是通过`<context:component-scan>`标签实现的,该标签位于XML配置文件中。这个标签告诉Spring去指定的包及其子包下查找标记为`@Component`、`@Service`、`@Repository`和`@Controller`的类,这些...
- `<context:component-scan>`: 扫描指定包下的组件。 - `<context:annotation-config>`: 启用注解驱动。 - `<context:property-placeholder>`: 引用外部属性文件。 - `<mvc:resources>`: 配置静态资源路径。 - `<tx...
</context:component-scan> ``` 这里配置了对`Controller`、`Service`和`Repository`注解的扫描,从而实现了对相应组件的自动装配。 #### 三、数据类型转换配置 在SSM框架中,数据类型转换主要是为了将前端传来的...
3. **组件扫描**:通过`<context:component-scan>`元素,不仅注册注解处理器,还可以扫描指定包下的类,自动发现和处理注解: ```xml <context:component-scan base-package="com.yourpackage"/> ``` `base-...
`context`命名空间下的 `<context:component-scan>`、`<context:property-placeholder>`等元素,用于扫描组件、加载外部属性文件,增强了Spring的应用范围和灵活性。 "cache"模块则提供了缓存抽象,支持如 EhCache...
`<context:annotation-config/>` 和 `<context:component-scan base-package="需要实现注入的类所在包"/>` 是两个重要的 XML 配置元素,它们用于开启注解支持和指定扫描的包范围。 - `<context:annotation-config/>...