1. Spring
Struts2作用在前端接受请求等,hibernate作用在后端,连接数据库 Spring作用于整体,在它的基础上系统的框架结构变得很灵活,用于整合hibernate 和spring框架,可以降低组件之间的关系,提高程序的灵活性和可扩展性。 主要依靠spring容器来实现,有容器管理对象。具有IOC和AOP特性。 IOC依赖注入,AOP面向切面编程。 有了IOC对象不再由程序员自己创建对象,例:User u=new User(); 而是将创建对象的任务交给了Spring容器。 AOP将一些通用的功能作用到指定的对象和过程中。任意一个处于spring容器中 的对象,都可以充当拦截器使用。比Struts2灵活的多。
Spring贯穿在整个应用之中,负责创建Action实例,创建Service实例,创建 DAO实例,并将被引用的实例注入到需要该实例的实例中。
2. 容器对对象的管理
使用最核心的考开发包:spring.jar、commons-logging.jar 定义applicatiionContext.xml,其中schema的版本要和导入jar报的版本一致。 Schema是一种与DTD类似,限制xml格式的文件。
1) bean元素的定义
<bean id=”标示” class=”包名.类名”> 也可以使用name=”标示” ,与 id的区别:id属性要求更加严格,具有唯一性, 不能使用特殊字符。
2)id属性:属性值要求更严格,具有唯一性,不能使用/,.等特殊字符
3)lazy-init属性:默认bean是在容器对象创建时创建对象, 可以使用该属性指定在调用ctx.getBean("标识名")方法时创建.
4)scope属性:用于指定bean对象创建模式.默认是singleton,单例模式. 可以指定为prototype,即每次调用getBean()都创建一个新对象.
5)init-method属性:用于指定初始化方法.相对应的有destory-method
3.依赖注入 DI
1)setter方法注入
a.基本类型注入
name的值username于对应的User类中的属性相同。
<bean name=”user” class=”com.cn.User”>
<property name=”username” >
<value>张三</value>
</property>
</bean>
b.集合类型注入
<property name="loves">
<list>
<value>芙蓉</value>
<value>菊花</value>
<value>小月月</value>
</list>
</property>
c.对象类型注入
<bean name="jdbcUserDao" class="com.cn.dao.JdbcUserDAO"></bean>
<bean name="userService2"
class="com.cn.service.UserServiceBean">
<!-- 将jdbcUserDao注入给UserService组件的userDao属性 -->
<property name="userDao" ref= "jdbcUserDao" />
</bean>
2)构造方法注入
<constructor-arg index="0" value="张三"/>
<constructor-arg index="1" ref="hibernateUserDao"/>
3)自动装配:spring容器可以根据指定规则,建立组件之间的调用关系. 可以为<bean>元素添加autowire属性指定自动装配规则.
byName:注入方bean的id值与被注入方的属性名相同.借助setter方法 byType:注入方bean的类型与被注入方的属性类型相同.借助 setter方法
<!-- 自动装配示例 -->
<bean id="hibernateUserDao" class="com.cn.dao.HibernateUserDAO" />
<bean id="userService" class="com.cn.service.UserServiceBean"
autowire="byType">
</bean>
constructor:与byType的方式类似,不同之处在于它应用于构造器参数
4.IOC概念
Inversion of Control:控制反转或者反向控制. 所谓的控制权是指对象的创建,初始化,调用关系的控制. 主要是指由Spring容器负责创建组件对象,指定对象之间的调用(依赖)关系. IOC通过DI实现.有了 Spring之后,控制权由使用者转移到了Spring容器.
5.基于注解方式配置
1)组件自动扫描功能
可以按指定的包路径,扫描带有以下注解的组件,纳入容器管理. 等价于<bean>元素的定义
@Controller : 控制层组件使用.例如 Action
@Service : 业务层组件使用.例如Service
@Repository : 数据访问层组件使用.例如 DAO
@Component : 任何组件都可以用
注意:需要在xml配置文件中开启自动扫描配置.
<context:component-scan base-package=""/>
2)指定注入关系(以下注解可以用在属性定义前,setter方法前)
@Autowired : 默认按类型装配.如果需要按名称装配,使用格式如下
@Autowired
@Qualifier("mainCatalog")
private MovieCatalog movieCatalog;
@Resource :默认按名称装配.找不到再按类型.使用格式如下
@Resource(name="myMovieFinder")
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
3)@Scope,@PostConstruct注解等价于<bean>元素的scope,init-method属性