控制反转(IOC)
概念:
有四个类:车,车身,底座,车轮
如果按照先设计轮子,底座依赖轮子设计,车身依赖底座设计
最后完成车子run,会带来一个问题
轮子大小变了,所有类需要重新设计。
控制反转的思路是
父类里的子类通过注入的方式实现子类的初始化
父类本身不会去new这个子类对象,这样子类修改时
spring帮我们完成对象的注入(实例化),而不需要动父类代码。
实现
xml方式:
<bean id="u" class="spring.DAO.implement.UserDAOImpl">
</bean>
<bean id="userService" class="spring.service.UserService" scope="prototype">
<!--scope默认singleton:每次调用同一个 UserDAOImpl对象 -->
<property name="userDAO" ref="u" />
<!--scope=prototype:每次实例化一个新的 UserDAOImpl对象 -->
</bean>
基于XML简单属性方式注入bean
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${user}" />
<property name="password" value="${password}" />
<!-- 数据库连接池配置 -->
<property name="initialSize" value="10" /><!-- 初始化连接数量 -->
<property name="maxActive" value="40" /><!-- 最大连接数量 -->
<property name="maxIdle" value="0" /><!-- 最大空闲连接数量 -->
<property name="minIdle" value="0" /><!-- 最小空闲连接数量 -->
<property name="maxWait" value="2000" />
<property name="validationQuery" value="select 1" />
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="false" />
</bean>
基于XML 构造方式注入bean
<bean id="u" class="spring.DAO.implement.UserDAOImpl">
</bean>
<bean id="userService" class="spring.service.UserService" scope="prototype">
<constructor-arg>
<ref bean="u"/>
</constructor-arg>
</bean>
基于XML 注入bean 额外扩展
自动装配:autowire="byName" autowire="byType" :如果是接口,会自动装配其子类
<bean id="userService" class="spring.service.UserService" autowire="byName">
指定bean初始化时调用的方法,实例化对象结束时调用的方法 待补充:有什么用
<bean id="userService" class="spring.service.UserService" init-method="init" destroy-method="destroy" >
注解
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
">
<!-- 扫描指定package -->
<context:component-scan base-package="com.chinasoft.imssreport" />
<!-- 扫描所有 -->
<context:annotation-config/>
</beans>
@Component @Repository @Service @Controller @bean
生命周期 初始化:@PostConstruct 销毁:@PreDestroy
作用域 @Scope("prototype") 多例
aop
aop
往我们的业务代码里加入 日志,信息校验,事物管理,权限管理,日志管理 等等通用功能,不改变原来的业务代码就能实现
底层实现是基于jdk代理的 动态代理 ,创建一个代理类,在我们调用业务类方法时,会将该业务类交给 代理类,执行完代理类的
通用功能代码再去调用业务类代码。
实现:
手写一个实现InvocationHandler接口的代理类(jdk动态代理)
用@aspect注解一个切面类
事务
事务
@Transactional:声明式事务管理
注解添加到类级别上。表示所有该类的公共方法都配置相同的事务属性信息。
类和方法都加了注解,方法级别的事务属性信息会覆盖类级别的相关配置信息。
实现原理
调用声明@Transactional 的目标方法时,Spring默认使用AOP代理
加入事务管理的代码 beginTransaction(),commit()
实现了事务管理