`

让Spring架构减化事务配置(4)

阅读更多

 

<!---->完整的实现类如下: BeanClassTypeAutoProxyCreator.java /**//** * 根据类型自动代理Creator * * @author yuanguangdong date: Jul 13, 2004 */ public class BeanClassTypeAutoProxyCreator extends AbstractAutoProxyCreator implements ApplicationContextAware, InitializingBean ...{ /**//** Logger that is available to subclasses */ protected final Log logger = LogFactory.getLog(getClass()); /**//** ApplicationContext this object runs in */ private ApplicationContext applicationContext; /**//** MessageSourceAccessor for easy message access */ private MessageSourceAccessor messageSourceAccessor; /**//**被代理的bean别名列表**/ private List beanNames; /**//**被代理的classType列表**/ private List classTypes; //--------------------------------------------------------- //实现AbstractAutoProxyCreator的抽像方法 //--------------------------------------------------------- /**//** * @see org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator
#getAdvicesAndAdvisorsForBean(java.lang.Class, * java.lang.String, org.springframework.aop.TargetSource) */ protected Object[] getAdvicesAndAdvisorsForBean(Class beanClass, String beanName, TargetSource targetSource) throws BeansException ...{ if (this.beanNames != null) ...{ if (this.beanNames.contains(beanName)) ...{ return PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS; } } return DO_NOT_PROXY; } //------------------------------------------------------- //实现ApplicationContextAware接口方法 //------------------------------------------------------- /**//** * @see org.springframework.context.ApplicationContextAware
#setApplicationContext(org.springframework.context.ApplicationContext) */ public void setApplicationContext(ApplicationContext context) throws BeansException ...{
if (context == null && !isContextRequired()) ...{ // Reset internal context state. this.applicationContext = null; this.messageSourceAccessor = null; }
else if (this.applicationContext == null) ...{ // Initialize with passed-in context. if (!requiredContextClass().isInstance(context)) ...{ throw new ApplicationContextException(
"Invalid application context: needs to be of type ["
+ requiredContextClass().getName() + "]"); } this.applicationContext = context; this.messageSourceAccessor = new MessageSourceAccessor(context); initApplicationContext(); }
else ...{ // Ignore reinitialization if same context passed in.
if (this.applicationContext != context) ...{ throw new ApplicationContextException( "Cannot reinitialize with different application context: current one is [" + this.applicationContext + "], passed-in one is [" + context + "]"); } } } /**//** * Determine whether this application object needs to run in an * ApplicationContext. * <p> * Default is "false". Can be overridden to enforce running in a context * (i.e. to throw IllegalStateException on accessors if outside a context). * * @see #getApplicationContext * @see #getMessageSourceAccessor */ protected boolean isContextRequired() ...{ return true; } /**//** * Determine the context class that any context passed to * <code>setApplicationContext</code> must be an instance of. Can be * overridden in subclasses. * * @see #setApplicationContext */ protected Class requiredContextClass() ...{ return ApplicationContext.class; } /**//** * Return the ApplicationContext instance used by this object. */ public final ApplicationContext getApplicationContext() throws IllegalStateException ...{ if (this.applicationContext == null && isContextRequired()) ...{
throw new IllegalStateException( "ApplicationObjectSupport instance [" + this + "] does not run in an ApplicationContext"); } return applicationContext; } /**//** * Return a MessageSourceAccessor for the application context used by this * object, for easy message access. * * @throws IllegalStateException * if not running in an ApplicationContext */ protected final MessageSourceAccessor getMessageSourceAccessor() throws IllegalStateException ...{ if (this.messageSourceAccessor == null && isContextRequired()) ...{ throw new IllegalStateException(
"ApplicationObjectSupport instance [" + this + "] does not run in an ApplicationContext"); } return this.messageSourceAccessor; } public void setClassTypes(String[] classTypes) ...{ this.classTypes = Arrays.asList(classTypes); } /**//** * Subclasses can override this for custom initialization behavior. Gets * called by <code>setApplicationContext</code> after setting the context * instance. * <p> * Note: Does </i>not</i> get called on reinitialization of the context but * rather just on first initialization of this object's context reference. * * @throws ApplicationContextException * in case of initialization errors * @throws BeansException * if thrown by ApplicationContext methods * @see #setApplicationContext */ protected void initApplicationContext() throws BeansException ...{ } //----------------------------------- //实现InitializingBean接口方法 //----------------------------------- /**//** * 查找指定classType的beanName列表 */ private List getBeanNames(String classType) ...{ List beanNameList = null; try ...{ String[] beanName = this.getApplicationContext() .getBeanNamesForType(Class.forName(classType), true, false); if (beanName != null) ...{ beanNameList = Arrays.asList(beanName); } } catch (ClassNotFoundException ex) ...{ throw new IllegalArgumentException("Class not found: " + ex.getMessage()); } return beanNameList; } /**//** * * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() */ public void afterPropertiesSet() throws Exception ...{ if (classTypes != null && !classTypes.isEmpty()) ...{ beanNames = new ArrayList(); for (int i = 0; i < classTypes.size(); i++) ...{ String classType = (String) classTypes.get(i); List aList = getBeanNames(classType); beanNames.addAll(aList); } } if (logger.isDebugEnabled()) ...{ for (int i = 0; i < beanNames.size(); i++) ...{ logger.debug("printBean:" + (String) beanNames.get(i)); } } } }
分享到:
评论

相关推荐

    spring架构详解 spring架构详解

    Spring的AOP模块提供了在运行时对代码进行横切关注点(如日志、事务管理)的能力。它通过代理模式实现,可以将切面逻辑与业务代码分离,提高代码的复用性和模块化。 5. **设计模式** Spring框架广泛运用了多种...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版) .pdf

    《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》这本书主要聚焦于Spring框架的核心架构和技术细节,帮助读者全面理解Spring的工作机制、设计理念以及实现方式。下面将根据书名及其描述来展开相关知识点。 ...

    Spring技术内幕:深入解析Spring架构与设计原理

    《Spring技术内幕:深入解析Spring架构与设计原理》是一本由计文柯编著的书籍,专注于揭示Spring框架的核心机制和设计理念。这本书是为那些希望深入理解Spring如何工作,以及为何如此高效和灵活的开发者而准备的。...

    spring技术内幕第2版深入解析spring架构与设计原理

    在深入解析Spring技术内幕第2版中,会详细探讨Spring框架的核心架构与设计原理,Spring作为一个轻量级的Java平台,提供了全面的编程和配置模型,是企业级Java应用程序开发中广泛使用的技术之一。 Spring的核心特性...

    SPRING技术内幕:深入解析SPRING架构与设计原理

    《SPRING技术内幕:深入解析SPRING架构与设计原理》这本书是Java开发领域的一部重量级作品,由具有丰富开发经验的专家撰写,受到了Java开发者社区和Spring开发者社区的高度推崇。书中深入剖析了Spring框架的核心架构...

    spring技术内幕-深入解析spring架构与设计原理

    《Spring技术内幕——深入解析Spring架构与设计原理》是一本深度剖析Spring框架核心机制与设计理念的专业书籍。本书旨在帮助读者全面理解Spring的内部工作原理,从而更好地应用和优化Spring框架在实际开发中的使用。...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)+.pdf

    根据提供的文件标题“Spring技术内幕:深入解析Spring架构与设计原理(第2版)”和描述,我们可以了解到这是一本深入探讨Spring框架内部架构和技术细节的专业书籍。虽然标签中出现了“oracle”,但从标题和描述来看,...

    SPRING技术内幕+深入解析SPRING架构与设计 55M(下载地址)

    ### Spring技术内幕与深入解析Spring架构与设计 #### 书籍概述 本书《Spring技术内幕+深入解析Spring架构与设计》是一本专为Spring框架开发者所撰写的深度技术指南。作者凭借超过十年的Java开发经验,从Spring 3.0...

    SPRING技术内幕:深入解析SPRING架构与设计原理.pdf 下载

    根据提供的标题和描述,我们可以深入探讨Spring框架的核心架构与设计原理。...对于希望深入了解Spring架构与设计原理的学习者来说,《SPRING技术内幕:深入解析SPRING架构与设计原理》这本书是一个非常宝贵的资源。

    SPRING技术内幕:深入解析SPRING架构与设计原理.zip

    《SPRING技术内幕:深入解析SPRING架构与设计原理》这本书深入探讨了Spring框架的核心机制和设计理念,旨在帮助读者理解并掌握Spring的精髓。Spring作为Java企业级应用开发的重要工具,其灵活性、可扩展性和模块化的...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版).pdf

    总而言之,《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》这本书通过深入浅出的方式讲解了Spring框架的核心原理,不仅涵盖了其核心的IoC容器、AOP、事务管理、Spring MVC等组件,还探讨了Spring在数据...

    SPRING技术内幕:深入解析SPRING架构与设计原理_spring_

    《SPRING技术内幕:深入解析SPRING架构与设计原理》这本书深入探讨了Spring框架的核心机制、设计理念以及在实际开发中的应用。Spring作为Java领域最流行的轻量级框架,它的广泛应用和强大功能使得深入理解其工作原理...

    Spring技术内幕 - 深入解析Spring架构与设计原理.rar

    《Spring技术内幕 - 深入解析Spring架构与设计原理》这本书是IT领域的经典之作,专为想要深入了解Spring框架的开发者而准备。Spring作为Java领域最广泛应用的轻量级框架,其设计理念和实现机制一直是广大程序员关注...

    深入解析Spring架构与设计原理.pdf

    《深入解析Spring架构与设计原理》是一本专为IT专业人士准备的深度学习Spring框架的书籍。Spring作为Java领域最广泛使用的轻量级框架之一,它的设计理念、核心组件以及实际应用都值得开发者深入研究。以下是对Spring...

    spring架构项目案例

    总结来说,"spring架构项目案例"是一个适合初学者的实践教程,涵盖了Spring 2.0的关键特性,包括依赖注入、AOP、Spring MVC、JDBC支持、事务管理和ORM集成。通过学习和实践这个项目,开发者可以掌握Spring的核心概念...

    spring mvc 事务配置+异常处理

    接下来,我们将深入探讨Spring MVC中的事务配置和异常处理。 **1. Spring MVC 事务配置** 在Spring中,事务管理主要依赖于Spring的`PlatformTransactionManager`接口,它是所有事务管理器的基类。Spring提供了多种...

    Spring技术内幕:深入解析Spring架构与设计原理(完整版)

    总的来说,Spring架构的设计原则包括模块化、松耦合、可扩展性和易用性。通过理解这些原理,开发者可以更好地利用Spring框架,构建出更健壮、更易于维护的Java应用。无论你是初识Spring,还是寻求进一步提升,这本...

Global site tag (gtag.js) - Google Analytics