-------------------------------------------------------------------------------------------------------------------------------------
spring简介:
struts是web层的框架,hibernate是持久层框架,spring是综合层。spring是个轻量级框架,不依赖于与J2EE容器,在J2SE环境下也能使用。
实际上的四层架构。
1.表现层:
a.对request和response的处理。
b.对数据 的显示。
c.非业务逻辑的验证。
d.异常的处理。
2.持久层:
a.ORM
b.提供面向对象的查询语言。
3.域层:业务逻辑的一部分。
4.服务层:
a.给业务逻辑暴露服务。
b.容器级别的服务怎么去实现。
--------------------------------------------------------------------------------------------------------------------------------------
spring的作用:
1.创建和管理业务逻辑对象(javabean)对象
2.管理业务逻辑之间的依赖关系。
3.让业务逻辑层中的javabean与集成层进行结合。
4.让业务逻辑层与表现层进行结合。
通过依赖注入来实现对象的关联关系的建立,降低了耦合度,支持了测试驱动开发;没有J2EE照样可以使用声明式事务,声明式事务不再依赖于容器;通过spring和其他框架集成,使得使用其他框架变得简单。
--------------------------------------------------------------------------------------------------------------------------------------
spring的特点:
1.在sprring框架中,把check类型的异常全部转化为uncheck类型,因为spring认为try--catch代码会污染业务逻辑。checked还是unchecked是针对编译器说的。
2.spring框架包含了很多的模块,我们可以使用spring提供的一个或者几个模块。spring可以定制服务,每种服务都是模块化的而且可伸缩的。
3.采用spring开发应用非常好,而且开发出来的东西是可重用的。
--------------------------------------------------------------------------------------------------------------------------------------
spring框架的组成
1.spring core:提供了IOC容器,是一个核心模块,其它所有模块以此为基础,提供了管理javabean对象和维护对象之间的依赖关系的功能。
2.spring aop:提供了面向切面编程的功能,有了IOC,才可以使用声明式事务。
3.spring dao:对jdbc做了轻量级的封装,简化jdbc编程。----->jdbcTemplate
4.spring context:是核心模块的一个扩展,提供了比核心模块core更多的功能,提供了更强大的功能。
5.spring orm:提供了集成持久层框架的能力,提供了跟其它框架集成的功能。
6.spring web:提供了web层框架的能力,提供了跟其他web框架的功能。
7.spring web mvc:是一个基于mvc的web框架的实现。
--------------------------------------------------------------------------------------------------------------------------------------
IOC控制反转
依赖注入是控制反转的一种方式,依赖注入有三种方式:接口注入、构造器注入、setter方法注入。
1.setter方法注入
如果在配置一个bean(bean类是标准的javaBean),采用的注入方式是setter注入,那么spring容器在创建bean时首先调用bean的无参构造函数,然后调用bean的setter方法,把它所依赖的对象注入进来。
<beans>
<bean name="example" class="com.spring.ioc.ExampleBean">
<property name="anotherBean">
<ref bean="anotherBean"/>
</property>
<property name="value">
<value>4321</value>
</property>
</bean>
<bean name="anotherBean" class="com.spring.ioc.AnotherBean">
<property>
<value>2008</value>
</property>
</bean>
</beans>
2.构造器注入
如果在配置一个bean时,采用的注入方式是构造器注入,那么spring容器在创建bean时调用有参的构造器,并且把它所依赖的对象注入进来。
<beans>
<bean name="example" class="com.spring.ioc.ExampleBean">
<constructor-arg index="0">
<ref bean="anotherBean"/>
</constructor-arg>
<property name="1">
<value>4321</value>
</property>
</bean>
<bean name="anotherBean" class="com.spring.ioc.AnotherBean">
<constructor-arg>
<value>2008</value>
</constructor-arg>
</bean>
</beans>
注:如果配置一个bean时,既声明了构造器注入,又声明了setter注入,那么spring容器在创建bean时首先调用有参构造器进行注入,然后调用setter方法注入。
三种不同类型的数据注入的声明方式
1.基本数据类型<value></value>
2.其它的bean对象<ref bean="otherBean">
3.集合类型<list></list>,<map></map><set></set><props></props>
-----------------------------------------------------------------------------------------------------------------------------------
在spring中创建非javabean类型的对象有三种方式:
1.静态工厂方法
a.创建一个工厂类,提供一个静态的工厂方法。
b.配置一个产品的bean class为工厂类,另外还要指定工厂方法的名字。
如下:<bean name="connection" class="***" factory-method="getConnection"><bean>
其中getConnection是"***"中的静态方法,返回值是一个需要的对象。
2.实例工厂方法
a.创建一个工厂类,提供一个非静态的工厂方法的名字。
b.配置一个工厂的bean
c.配置一个产品的bean,指定工厂bean的名字,以及工厂方法的名字。
如下:<bean name="factory" class="***"/>
<bean name="beanId" factory-bean="factory" factory-method="getConnection"></bean>
其中getConnection是"***"中的非静态方法,返回值是一个需要的对象。
3.提供工厂类,实现factoryBean接口。
配置一个产品的bean默认为singleton;
---------------------------------------------------------------------------------------------------------------------------------
singletons:spring中的bean对象是唯一的,只创建一次。
prototypes:只要使用一次getBean,就创建一个bean对象。
在BeanFactory中的bean对象默认为singleton。
在BeanFactory中的bean对象是延迟创建的。
---------------------------------------------------------------------------------------------------------------------------------
bean的生命周期
创建过程:
1.容器寻找bean的定义信息并且将其实例化。
2.使用依赖注入,Spring按照bean定义信息完成依赖注入。
3.如果bean实现了BeanNameAware接口,工厂调用setBeanName方法。
4.如果bean实现了BeanFactoryAware接口,工厂调用setBeanFactory方法传入工厂本身。
5.如果bean实现了InitializingBean接口,则调用afterPropertiesSet方法。
6.如果bean指定了init-method方法,它将被调用。
销毁过程:
1.如果Bean实现了DisposableBean接口,则调用destory接口。
2.如果Bean实现了destory-method,则调用它。
---------------------------------------------------------------------------------------------------------------------------------
applicationContext
1.对BeanFactory实现了功能上的扩展。
2.预先实例化单例的Bean
3.提供对BeanPostProcessor以及对BeanFactoryProcessor的注册和检查。
4.支持嵌套的Context。
5.提供事件处理机制。
6.支持国际化。
---------------------------------------------------------------------------------------------------------------------------------
Aop的一些概念
1.关注点:
是指一个系统需要关注的一些主要问题,可以分成两大类,核心关注点和横切关注点。
其中业务关注点是指业务逻辑。
2.横切关注点:
是指系统级别的服务,实现代码散落在多个类或者方法中的关注点。比如日志、事务、安全。
3.方面(abject)
方面就是对横切关注点的模块化。把那些散落在各处的用于实现这个关注点的代码整到一处。
4.连接点
就是整个程序运行过程中的某一点。
一般是指:方法调用;属性访问;异常抛出。
5.增强=====
在特定连接点执行的动作就是增强。
1.前增强:就是在目标对象方法调用之前执行的动作。
2.后增强:就是在目标对象方法调用之后执行的动作。
3.环绕增强:就是在目标对象方法调用前后都会执行的动作。
4.抛出增强:就是在目标对象方法中抛出异常之后执行的动作。
6.切入点:一组连接点的总称。
7.目标对象:被拦截器拦截的对象。
8.代理对象:目标对象增强一些额外功能之后产生的对象,称为代理对象。
9.织入:就是给目标对象加上额外功能产生代理对象的整个过程称为织入。
----------------------------------------------------------------------------------------------------------------------------------
Aop编程的过程:
1.定义目标对象
2.定义拦截器
3.定义代理对象
----------------------------------------------------------------------------------------------------------------------------------
spring中的DAO
1.使用jdbc
配置DataSource
配置一个 DataSource的Bean,(1)类型为org.apache.commons.dbcp.BasicDataSource.然后给他指定一些参数。
(2)类型为org.springFramework.jndi.JndiObjectFactoryBean.这个类型是实现FactoryBean接口的,生产的产品为通过jndi查找到的对象。
2.使用hibernate
配置SessionFactory
配置一个SessionFactory的bean
类型为org.springFramework.orm.hibernate3.LocalSessionFactoryBean
或者类型为org.springFramework.jndi.JndiObjectFactoryBean.这个类型是实现FactoryBean接口的, 生产的产品为通过jndi查找到的对象。
-----------------------------------------------------------------------------------------------------------------------------------
spring中的web
spring跟struts集成使用
1.在web.xml中配置一个监听器,用来初始化spring上下文;它会创建ApplicationContext对象ac,并且把ac放到ServletContext中。
2.在struts-config.xml文件中配置一个action,类型为spring框架提供的一个类型。主要工作是从ServletContext中取到ApplicationContext对象ac。然后从ac中找到名字为action path的那个bean,并且调用这个bean的execute方法。
3.在spring的配置文件中配置一个bean,类型为真正的action的类型,bean的名字必须跟struts-config.xml中配置的action的path一致。