1.spring
(1) 六大模块
- Spring Core spring的核心功能:核心容器的主要组件是BeanFactory,它是工厂模式的实现,它使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际应用程序代码分开。
- Spring AOP 切面编程
- SpringEE spring 对javaEE其他模块的支持
- Spring DAO DAO模式的思想是将业务逻辑代码与数据库交互代码分离,降低两者之间的耦合。还提供了JDBC的抽象层,和对声明式事务和编程式事务的支持
- Spring ORM 提供了对ORM框架的支持Hibernate和Mybatis等
- Spring Web Spring对web模块的支持。Struts2和Springmvc等
Spring除了核心的IOC和AOP功能之外,从后台数据库的交互DAO和ORM到跨V(View)和C(Control)的Web模块,它提供的模块支持应用在整个项目中,简单的说,它什么都可以搞定,非常强大。
(2) 控制反转IOC(Inversion of Control)和依赖注入DI(Dependency Injection)式同一个概念:
(what) 当某个角色(可以看作式一个Java实例)需要另一个角色(被调用者)的协助式,在传统的程序中,通常由调用者来创建被调用者的实例,但在spring中,创建被调用者实例的工作不再由调用者来完成,因此称为控制反转,创建被调用者实例的工作通常由spring容器来完成,然后注入调用者,因此也称为依赖注入。
小编认为,只有控制反转(IOC)在spring的容器中创建被调用者的Bean实例,才能依赖注入(构造器注入,Setter注入,接口注入)到调用者的Bean实例中,这应该是一个先后过程。
(why)Spring可以有效的组织J2EE应用各层的对象。不管是控制层的Control对象,还是业务层的Service对象,还是持久层的Dao对象,都可以在Spring的管理下有机地协调,运行,它将各层的对象以松耦合的方式组织在一起,Control对象无需关心Service对象的具体实现,Service对象无需关心持久化层对象的具体实现,各层对象的调用完全面向接口。当系统需要重构时,代码的改写将大大减少。
(How)关于怎样用小编就不详细写了。
(3)AOP: AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程,当前已经成为一种比较成熟的编程思想,可以用来很好的解决应用系统中分布于各个模块的交叉关注点问题。在轻量级的J2EE中应用开发中,使用AOP来灵活处理一些具有横切性质的系统级服务,如事务处理、安全检查、缓存、对象池管理等,已经成为一种非常适用的解决方案。
面向对象编程(OOP)解决问题的重点在于对具体领域模型的抽象,而面向切面编程(AOP)解决问题的关键则在于对关注点的抽象。也就是说,系统中对于一些需要分散在多个不相关的模块中解决的共同问题,则交由AOP来解决;AOP能够使用一种更好的方式来解决OOP不能很好解决的横切关注点问题以及相关的设计难题来实现松散耦合。因此,面向方面编程 (AOP) 提供另外一种关于程序结构的思维完善了OOP,是OOP的一种扩展技术,弥补补了OOP的不足。
AOP中比较重要的概念有:Aspect、JoinPoint、PonitCut、Advice、Introduction、Weave、Target Object、Proxy Object等。
Advice(通知): 为开发人员想要实现的功能,例如,安全,事务,日志。
当每次调用service包下的任何类的任何方法时,都会先调用Aop中的切面的功能。因为事务早就在spring中全部封装好了,没有如此复杂,例如纯xml的注解配置事务,注解版的事务配置更是简单的一批。
<context:component-scan base-package="com.iotek"/>
<!-- 配置事务异常封装 -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
<property name="user" value="zhubin"/>
<property name="password" value="123"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="annotatedClasses">
<list>
<value>com.iotek.domain.User</value>
</list>
</property>
<!-- hibernate 配置属性-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<!-- hibernate4 才配置事务-->
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<!-- 将事务给hibernatefactory工厂管理 -->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--开启事务注解的支持 与下面手动配置一样-->
<tx:annotation-driven transaction-manager="txManager"/>
<!-- 将限定需要事务的方法,并将它加入通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" propagation="REQUIRED"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="exists" propagation="REQUIRED"/>
<tx:method name="register" propagation="REQUIRED"/>
<!-- <tx:method name="*" propagation="SUPPORTS" read-only="true"/> -->
</tx:attributes>
</tx:advice>
<!-- 通知器的配置 通知+切入点 -->
<aop:config>
<aop:pointcut expression="execution(public * com.iotek.serviceimpl.*.*(..))" id="pc"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>