`
ailongni
  • 浏览: 61920 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

关于@PostConstruct不起作用,以及context:component-scan父子容器,事务失败

 
阅读更多
  • @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扫描器—spring组件扫描使用详解

    在Spring框架中,`&lt;context:component-scan/&gt;`元素是核心组件扫描的基石,它允许我们自动检测和注册...在实际项目中,结合使用`@Component`家族注解和`&lt;context:component-scan/&gt;`,能够构建出高效、灵活的Spring应用。

    Spring注解详解

    Spring注解详解 Spring框架中,注解(Annotation)是一种元数据,能够提供更多关于程序元素的信息,从而简化配置和编程。...* `@Component`: 标记一个类作为组件(不推荐使用)。 * `@Scope`: 指定Bean的作用域。

    java @PostConstruct和@PreConstruct注解

    Java @PostConstruct 和 @PreConstruct 注解详解 Java 中的 @PostConstruct 和 @PreConstruct 注解是从 Java EE5 规范开始引入的,它们是用来修饰 Servlet 生命周期的两个重要的注解。下面将详细介绍这两个注解的...

    spring annotation 入门

    - **组件扫描**:使用`&lt;context:component-scan&gt;`标签来指定要扫描的包路径,从而自动发现和注册带有`@Component`、`@Service`、`@Repository`、`@Controller`等注解的类。 - **示例**: ```xml &lt;context:...

    @PostConstruct 和 @PreDestroy 使用

    在Java世界中,`@PostConstruct` 和 `@PreDestroy` 是两个非常重要的注解,它们主要用于管理组件的生命周期,特别是在使用Spring框架或者Java EE应用中。这两个注解是JSR 250规范的一部分,提供了对bean初始化和销毁...

    @PostConstruct注解用来获取springbean对象.txt

    获取springbean对象

    springmvc注解

    - **作用**:@Resource用于注入依赖,@PostConstruct用于初始化方法,@PreDestroy用于销毁前的操作。 - **示例**: ```java @Resource private MyService myService; @PostConstruct public void init() { ...

    SpringBoot @PostConstruct原理用法解析

    SpringBoot @PostConstruct原理用法解析 @PostConstruct 注解是 Spring 框架的一个重要组件,主要用于在 Bean 初始化之前执行某些操作。今天,我们将深入探讨 @PostConstruct 的用法和原理,并通过示例代码来演示其...

    Spring3注解介绍.docx

    13. **@Component**:通用注解,可以标记任何组件,但通常不推荐单独使用,而应使用更具体的如@Service、@Repository或@Controller。 14. **@Scope**:定义bean的作用域,如单例(singleton)、原型(prototype)等...

    Spring注解@Component、@Repository、@Service、@Controller区别.doc

    Spring 注解@Component、@Repository、@Service、@Controller 区别 在 Spring 框架中,@Component、@Repository、@Service、@Controller 是四个常用的注解,它们都是继承自 @Component 注解,用于标注不同的组件或 ...

    详解 Spring 3.0 基于 Annotation 的依赖注入实现

    但这并不常见,因为 `@Component`、`@Service`、`@Repository` 和 `@Controller` 已经涵盖了大部分需求。 7. **作用域**: - 注解定义的 Bean 默认作用域为 "singleton",即每个 Bean 只有一个实例。若需改变作用...

    spring注解

    * `@Component`:标记一个组件 Bean(不推荐使用) * `@Scope`:标记一个 Bean 的作用域 * `@Se`:标记一个安全上下文 过滤方式 Spring 提供了四种类型的过滤方式: * 注解过滤:使用 `@IncludeFilter` 或 `@...

    Spring学习笔记(9)----让Spring自动扫描和管理Bean

    除了基本的`@Component`家族,Spring还提供了一些高级注解,如`@Scope`用于定义Bean的作用域,`@Lazy`用于延迟初始化Bean,`@Qualifier`用于在多个相同类型的Bean中指定特定的一个。 ### **总结** Spring的自动...

    Spring的自动扫描注入.docx

    在 Spring 2.5 中,引入了组件自动扫描机制,该机制可以在类路径下寻找标注了 @Component、@Service、@Controller、@Repository 注解的类,并将这些类纳入 Spring 容器中管理。 @Component、@Repository、@Service...

    spring注解文档

    2. **组件扫描(@Component, @Service, @Repository, @Controller)** - `@Component`是基础注解,用于标记任何普通bean。 - `@Service`用于业务逻辑层,通常是对`@Component`的细化。 - `@Repository`用于数据...

    Spring定时任务中@PostConstruct被多次执行异常的分析与解决

    然而,在Spring定时任务(如使用`@Scheduled`注解的方法)中,如果遇到`@PostConstruct`被多次执行的情况,这通常意味着存在配置问题或对Spring生命周期的理解不准确。下面我们将深入分析这个问题,并提供相应的解决...

    Spring注解收集1

    - **定义**:`@Component`注解是一个通用的组件注解,可以用于任何层的类,通常用于标记那些不属于特定分层(如服务层、控制层)的组件。 - **示例**: ```java @Component public class GenericComponent { // ...

    day38 16-Spring的Bean的装配:注解的方式

    1. **启用注解配置**:在Spring配置文件中添加`&lt;context:component-scan&gt;`标签,指定要扫描的包,这样Spring会自动发现带有`@Component`及其派生注解的类。 ```xml &lt;context:component-scan base-package=...

    Spring的Annotation配置相关讲义

    `&lt;context:component-scan&gt;`元素用于指定需要扫描的包,这样Spring会自动发现这些包下标记了如`@Component`、`@Service`、`@Repository`等注解的类,并将它们注册为Bean。 接着,我们看DAO层的配置。使用`@...

Global site tag (gtag.js) - Google Analytics