- @PostConstruct关于这个没有生效,主要是@PostConstruct执行是在类实例化之后,如果bean归Spring管理,bean不能延迟加载(Spring xml 中default-lazy-init=false或在实体类上@Lazy(false))
- context:component-scan 是Spring 提供的扫描注解类,加载注解并实例化,如果MVC 采用的是Spring自己的, 就有存在父子容器的问题,bean的扫描重复覆盖,直至到时事务失效等等系列问题,context:component-scan 组件有一系列属性,主要如下
<context:component-scan base-package="" resource-pattern="**/*.class" name-generator="org.springframework.context.annotation.AnnotationBeanNameGenerator" use-default-filters="true" annotation-config="true"> <context:include-filter type="aspectj" expression=""/> <context:exclude-filter type="regex" expression=""/> </context:component-scan>
详情可以查询 http://www.iteye.com/topic/1121913 和 http://jinnianshilongnian.iteye.com/blog/1762632
文章中作者主要是修改了 base-package的路径,bean中扫描的和mvc中扫描的路径不一样,从而避免上述问题, 但这依赖于路径规划,
比如com.a.b.web com.a.b.servie
<context:component-scan base-package="com.a.b.web" use-default-filters="false">
<context:component-scan base-package="com.a.b.service" >
这里说下 use-default-filters , context:component-scan默认是为true的,标示扫描@Component、@ManagedBean、@Named , 默认帮你include-filter 这几个Annotion,include-filter和exclude-filter,会再如下进行过滤排除
protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException { for (TypeFilter tf : this.excludeFilters) { if (tf.match(metadataReader, this.metadataReaderFactory)) { return false; } } for (TypeFilter tf : this.includeFilters) { if (tf.match(metadataReader, this.metadataReaderFactory)) { AnnotationMetadata metadata = metadataReader.getAnnotationMetadata(); if (!metadata.isAnnotated(Profile.class.getName())) { return true; } AnnotationAttributes profile = MetadataUtils.attributesFor(metadata, Profile.class); return this.environment.acceptsProfiles(profile.getStringArray("value")); } } return false; }
如果项目路径相同(mvc和bean),则需要如下配置
MVC(Spring-mvc.xml):
<context:component-scan base-package="com.a.b" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
Bean(application.xml)
<context:component-scan base-package="com.a.b"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
服务器启动application.xml先执行,此时use-default-filters=true是默认值会扫描(@Component、@ManagedBean、@Named),@Component是@Service、@Repository、@Controller的子集,但会被context:exclude-filter过滤到Controller,留下Service、Repository、Component
接着加载Spring-mvc.xml,此时use-default-filters=false,则是会检索到include-filter对应的Controller
正好mvc 和 application 分开加载注解。解决了重复加载的一些问题,如下
1、事务失效,以及Spring data jpa @Modifying注解异常
2、Spring的异步执行 @Async
总结:
主要是理解Spring context:component-scan的 注解和相关属性,会交给ContextNamespaceHandler类,具体是ComponentScanBeanDefinitionParser类读取,并有ClassPathBeanDefinitionScanner进行处理
相关推荐
在Spring框架中,`<context:component-scan/>`元素是核心组件扫描的基石,它允许我们自动检测和注册...在实际项目中,结合使用`@Component`家族注解和`<context:component-scan/>`,能够构建出高效、灵活的Spring应用。
Spring注解详解 Spring框架中,注解(Annotation)是一种元数据,能够提供更多关于程序元素的信息,从而简化配置和编程。...* `@Component`: 标记一个类作为组件(不推荐使用)。 * `@Scope`: 指定Bean的作用域。
Java @PostConstruct 和 @PreConstruct 注解详解 Java 中的 @PostConstruct 和 @PreConstruct 注解是从 Java EE5 规范开始引入的,它们是用来修饰 Servlet 生命周期的两个重要的注解。下面将详细介绍这两个注解的...
- **组件扫描**:使用`<context:component-scan>`标签来指定要扫描的包路径,从而自动发现和注册带有`@Component`、`@Service`、`@Repository`、`@Controller`等注解的类。 - **示例**: ```xml <context:...
在Java世界中,`@PostConstruct` 和 `@PreDestroy` 是两个非常重要的注解,它们主要用于管理组件的生命周期,特别是在使用Spring框架或者Java EE应用中。这两个注解是JSR 250规范的一部分,提供了对bean初始化和销毁...
获取springbean对象
- **作用**:@Resource用于注入依赖,@PostConstruct用于初始化方法,@PreDestroy用于销毁前的操作。 - **示例**: ```java @Resource private MyService myService; @PostConstruct public void init() { ...
SpringBoot @PostConstruct原理用法解析 @PostConstruct 注解是 Spring 框架的一个重要组件,主要用于在 Bean 初始化之前执行某些操作。今天,我们将深入探讨 @PostConstruct 的用法和原理,并通过示例代码来演示其...
13. **@Component**:通用注解,可以标记任何组件,但通常不推荐单独使用,而应使用更具体的如@Service、@Repository或@Controller。 14. **@Scope**:定义bean的作用域,如单例(singleton)、原型(prototype)等...
Spring 注解@Component、@Repository、@Service、@Controller 区别 在 Spring 框架中,@Component、@Repository、@Service、@Controller 是四个常用的注解,它们都是继承自 @Component 注解,用于标注不同的组件或 ...
但这并不常见,因为 `@Component`、`@Service`、`@Repository` 和 `@Controller` 已经涵盖了大部分需求。 7. **作用域**: - 注解定义的 Bean 默认作用域为 "singleton",即每个 Bean 只有一个实例。若需改变作用...
* `@Component`:标记一个组件 Bean(不推荐使用) * `@Scope`:标记一个 Bean 的作用域 * `@Se`:标记一个安全上下文 过滤方式 Spring 提供了四种类型的过滤方式: * 注解过滤:使用 `@IncludeFilter` 或 `@...
除了基本的`@Component`家族,Spring还提供了一些高级注解,如`@Scope`用于定义Bean的作用域,`@Lazy`用于延迟初始化Bean,`@Qualifier`用于在多个相同类型的Bean中指定特定的一个。 ### **总结** Spring的自动...
在 Spring 2.5 中,引入了组件自动扫描机制,该机制可以在类路径下寻找标注了 @Component、@Service、@Controller、@Repository 注解的类,并将这些类纳入 Spring 容器中管理。 @Component、@Repository、@Service...
2. **组件扫描(@Component, @Service, @Repository, @Controller)** - `@Component`是基础注解,用于标记任何普通bean。 - `@Service`用于业务逻辑层,通常是对`@Component`的细化。 - `@Repository`用于数据...
然而,在Spring定时任务(如使用`@Scheduled`注解的方法)中,如果遇到`@PostConstruct`被多次执行的情况,这通常意味着存在配置问题或对Spring生命周期的理解不准确。下面我们将深入分析这个问题,并提供相应的解决...
- **定义**:`@Component`注解是一个通用的组件注解,可以用于任何层的类,通常用于标记那些不属于特定分层(如服务层、控制层)的组件。 - **示例**: ```java @Component public class GenericComponent { // ...
1. **启用注解配置**:在Spring配置文件中添加`<context:component-scan>`标签,指定要扫描的包,这样Spring会自动发现带有`@Component`及其派生注解的类。 ```xml <context:component-scan base-package=...
`<context:component-scan>`元素用于指定需要扫描的包,这样Spring会自动发现这些包下标记了如`@Component`、`@Service`、`@Repository`等注解的类,并将它们注册为Bean。 接着,我们看DAO层的配置。使用`@...