spring
SE/EE开发的一站式框架------->有EE开发的每一层解决方案。
WEB层 :SpringMVC
Service层 :Spring的Bean管理,Spring声明式事务
DAO层 :Spring的Jdbc模板,Spring的ORM模块
一、特点
方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里 ,测试不再是昂贵的操作,而是随手可做的事情。例如: Spring对Junit4支持,可以通过注解方便的测试Spring程序。
方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度, Spring提供 了对各种优秀框架(如Struts, Hibernate、Hessian、 Quartz) 等的直接支持。
降低Java EE API的使用难度
Spring对很多难用的Java EE API (如JDBC, JavaMail, 远程调用等)提供了- -个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
二、Spring的两大特征
IOC
在任何一个有实际开发意义的程序项目中,我们会使用很多类来描述它们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑。这个时候,每个类都需要负责管理与自己有交互的类的引用和依赖,代码将会变的异常难以维护和极度的高耦合。而IOC的出现正是用来解决这个问题,我们通过IOC将这些相互依赖对象的创建、协调工作交给Spring容器去处理,每个对象只需要关注其自身的业务逻辑关系就可以了。在这样的角度上来看,获得依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其他对象和文件资料等等)
AOP
面向切面编程,往往被定义为促使软件系统实现关注点的分离的技术。系统是由许多不同的组件所组成的,每一个组件各负责一块特定功能。除了实现自身核心功能之外,这些组件还经常承担着额外的职责。例如日志、事务管理和安全这样的核心服务经常融入到自身具有核心业务逻辑的组件中去。这些系统服务经常被称为横切关注点,因为它们会跨越系统的多个组件。通过AOP简化了代码的内容,将目标对象复杂的内容进行解耦,分离业务逻辑与横切关注点。
深入理解Spring的两大特征
三、ApplicationContext
加载配置文件的时候,就会将Spring管理的类都实例化。 //BeanFactory 调用getBean的时候,才会生成类的实例
ApplicationContext applicationContext =new ClassPathXmlApplicationContext(“applicationContext .xml”)
//加载类路径下的配置文件
xxDao=(XXDao)applicationContext .getBean("xxDao");
四、Bean的作用范围 scope
singleton :默认的,Spring会采用单例模式创建这个对象。
prototype :多例模式。(Struts2和Spring整合一定会用到)
request :应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。
session :应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。
globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
五、Spring的属性注入
1、构造方法
<bean id=''car" class="com.baidu.XXX">
<constructor-arg name="name" value="100"/>
<constructor-arg name="age" value="18"/>
</bean>
2、set方法
<bean id=''xx" class="com.baidu.XXX">
<property name="name" value="100"/ />
</bean>
<bean id=''xxx" class="com.baidu.XXX">
<property name="name" value="100"/ />
<property name="car" ref="car"/ />
</bean>
3、P名称空间 (Spring2.5以后)
<beans
xmls:p="...."
<bean id=''xx" class="com.baidu.XXX" p:name="age" p:value="33">
</bean>
</beans>
4、SpEL (Spring3.0以后)
Spring Expression Language,Spring的表达式语言
<bean id=''info" class="com.baidu.Hh"><property name="name" value="100"/></bean>
<bean id=''xxx" class="com.baidu.XXX">
<property name="name" value="#{infor.name}"/ />
<property name="age" value="#{'23'}"/ />
<property name="car" value="#{car}"/ />
</bean>
5、集合类型属性注入
六、Spring的IOC的注解方式
配置包扫描
<!-- Spring 的包的扫描:扫描这个包的下的所有类,看那些类上有对应的注解,就会生成这个类的实例-- >
<context:component-scan
base-package= "com. itheima. spring. demo1"></context: component-scan>
在相应的类上配置注解
@Component ("userDao")//相当于在 Spring的配置文件中配置<bean id="userDao" class="xxx.UserDaoImpl">
@Component这是一一个修饰类的注解。Spring 看类上是否有该注解,如果有该注解,生成这个类的实例。其实这个注解描述EE开发的三层结构的时候,不是特别清晰。所以Spring提供了三个行生注解。三个衍生注解功能目前与@Component -致。为了后续的版本中进行增强的。
三个衍生注解如下:
@Controller :修饰WEB层类
@Service :修饰业务层类
@Repository :修饰DAO层类
属性注入的注解
@Value: 普通类型(String 和基本数据类)使用@Value注解修饰,如果使用了属性注入的注解,类中的属性可以不需要提供set方法,但如果提供了set方法,注解要加在set方法上。
@Autowired: 对象类型(类,对象)使用@Autowired注解。如果使用@Autowired默认是按照类型进行属性注入的。但是开发中习惯使用按名称进行属性注入。必须使用@Autowired和@Qulifer注解- -起 使用。其实还有一个注解@Resource注解,这个注解其实不是Spring框架提供的,制定标准的组织提供的一个注解,Spring 符合这个标准的规范。
七、Spring的XML和注解开发的区别
X | 基于XML配置 | 基于注解配置 |
---|---|---|
Bean定义 | <bean id=..."class-".." /> |
@Component衍生类@Repository@Service @Controller |
Bean名称 | 通过id或name指定 | @Component("person") |
Bean注入 | <property>或者通过p命名空间 |
@Autowired按类型往入@Qualifier按名称注入 |
生命过程 | init-method destroy-method | @PostConstruct初始化 @PreDestroy销毁 |
Bean作用范围 | scope属性 | @Scope设置作 用范围 |
适合场景 | Bean来自第三方,使用其它 | Bean的实现类由用户自己开发 |
XML :结构更加清晰,维护方便。适合范围广。
注解:开发便捷,进行属性注入的时候不需要set方法。适用范围自定义类。
八、Spring的AOP开发:AspectJ方式(XML方式)
AspectJ:本身就是一个面向切面的框架,Spring引入其作为自身的AOP开发
Spring实现AOP使用两种代理机制
1、JDK动态代理
2、cglib动态代理
Joinpoint (连接点) :所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法因为spring只支持方法类型的连接点,
Pointcut( 切入点) :所谓切入点是指我们要对哪些Joinpoint进行拦截的定义
Advice (通知增强) :所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知环绕通知(切面委完成的功能》
Introduct ion(引介):引介是一种特殊的通知在不修改类代码的前提下,Introduct ion可以在运行期为类动态地添加些方法或Field.
Target (目标对象):代理的目标对象
Weaving (织入) :是指把增强应用到目标对象来创建新的代理对象的过程.spring采用动态代理织入,而AspectJ采用编译期织入和类装在期织入
Proxy (代理) :一个类被AOP织入增强后,就产生一个结果代理类
Aspect (切面):是切入点和通知(引介)的结合
<!--配置前置通知-->
<aop:config>
<!--切入点 : 真正増強的方法-->
//execution表达式:指定増強的方法
<aop:pointcut expression= "execution(*com.baidu.spring.demo.LinkManDao.save())" id="pointcutI "/>
<aop:pointcut expression="execution(*com.baidu.spring.demo3.LinkManDao.update())"" id= "pointcut2"/>
<!--配置AOP的切面-->
<aop:aspect ref="myAspect ">
<!--配置前置通知-->
<aop:before method= "priviegeCheck" pointcut-ref= "pointcutI"/>
</aop:aspect>
</aop:config>
九、Spring的AOP开发:注解方式
AspectJ的AOP的注解:
@Aspect :定义切面类的注解
通知类型:
- @Before:前置通知
- @AfterReturing:后置通知:
- @Around:环绕通知
- @After:最终通知
- @AfterThrowing:异常抛出通知
@Pointcut:定义切入点的注解
1、编写并配置目标类
2、开启aop注解的自动代理:
<aop: aspectj- autoproxy/>
3、定义切面类
@Aspect
public class MyAspectAnno(
@Before ("MyAspectAnno.pointcut1()")
public void before(){
System.out.println("前置通知=====");
}
@Pointcut ("execution(* cn. itcast. spring. demo4. ProductDao.save(..))")
private void pointcut1(){}
4、配置切面
十、Spring的声明式事务管理
声明式事务管理(XML):思想是AOP
1、配置事务管理器
<bean id="transationManager" class="...">
<!--配置事务管理器-->
<property name="dataSource" ref="dataSource">
</bean>
2、配置事务的通知
<!--配置事务的增强-->
<tx:advice id="txAdvice" transation-Manager="transationManager">
<tx:attributes>
<!--
isolation="DEFAULT" 隔离级别
propagation="REQUIRED" 传播行为
read-only="false" 只读
imeout="-1" 过期时间
rollback- for="" - Exception
no-rol lback-for="" + Exception
-->
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
3、配置AOP事务
<aop:config>
<!--切入点 : 真正増強的方法-->
<aop:pointcut expression= "execution(*com.baidu.transation.transferr(..))" id="pointcutI "/>
<aop:advisor advice-ref= "txAdvice" pointcut-ref= "pointcut1"/>
</aop:config>
声明式事务管理(注解方式)
1、配置事务管理器
<bean id="transationManager" class="...">
<!--配置事务管理器-->
<property name="dataSource" ref="dataSource">
</bean>
2、开启事务管理的注解
<!--开启注释事务管理-->
<tx:annotation-driven transation-manager="transationManager"/>
3、在使用事务的类上添加一个注解:@Transational
@Transational
class XXXXServiceImpl extends XXXXService{
......................
}