spring 使用目的
个人理解:容器,或者一个池,把所有对象(bean)集合起来,别人需要使用的时候,问spring要,spring给,房屋中介是不是更加形象?spring两个特性及底层原理
使用的时候必须有命名空间等
(1)控制反转、依赖注入,bean池
将创建对象的权利交给spring,完成控制权的翻转,不再利用new关键字创建对象,而是使用spring利用反射技术创建对象。
创建对象的时候,进行注入,比如service里面使用dao,在配置文件中将dao注入到service中。
(2)事务管理
声明式事务和基于注解的事务管理。声明式事务就是利用动态代理及面向切面编程AOP在配置文件中进行事务的配置,主要是切入点、增强类、传播域、事务类型。
基于注解的方式是使用关键字 @Transactional在方法上声明一下。基于配置文件的spring
即所用的bean、事务管理全部在xml中进行配置。
(1)bean
<beans>
<bean id="",class="",name="">
<property name="",value=""/>
或者
<constructor-arg name="",value=""/>
</bean>
</beans>
其中id唯一标识bean,class是bean所在类,name 是id的别名,但是唯一标识一个bean的是id,而不是name.
bean使用大全
bean是啥
(2)反射原理实现bean
//首先会先通过dom4j解析该id属性得到该id字符串
//然后在解析class属性得到class的全名
String idStr=…;
String classStr=…;
//通过反射创建实体对象
Class clazz=Class.forName(classStr);
Object obj=clazz.newInstance();
//spring容器存放该对象,以id为key
container.put(idStr,obj);
bean底层原理
(3)事务管理AOP
编程式事务管理
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--配置事务管理的模板-->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
<!--定义事务隔离级别,-1表示使用数据库默认级别-->
<property name="isolationLevelName" value="ISOLATION_DEFAULT"></property>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"></property>
</bean>
声明式事务管理
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert" propagation="REQUIRED" read-only="false" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pointCut" expression="execution (* com.gray.service.*.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="pointCut"/>
</aop:config>
基于@Transactional注解 `
<!-- 声明式事务管理 配置事物的注解方式注入-->
<tx:annotation-driven transaction-manager="transactionManager"/>
@Transactional(rollbackFor=Exception.class)
public void insert(String sql, boolean flag) throws Exception {
dao.insertSql(sql);
// 如果flag 为 true ,抛出异常
if (flag){
throw new Exception("has exception!!!");
}
}
(4)AOP原理
利用接口接口反射
public class TxHandler implements InvocationHandler {
private Object originalObject;
public Object bind(Object obj) {
this.originalObject = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
if (!method.getName().startsWith("save")) {
UserTransaction tx = null;
try {
tx = (UserTransaction) (new InitialContext().lookup("java/tx"));
result = method.invoke(originalObject, args);
tx.commit();
} catch (Exception ex) {
if (null != tx) {
try {
tx.rollback();
} catch (Exception e) {
}
}
}
} else {
result = method.invoke(originalObject, args);
}
return result;
}
}
spring的两种动态代理
5. spring的注解类型
(1)@Component
是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。
(2)@Service对应表现层的Bean,也就是Service
@Service
public class AServiceImpl implements AService {
(3)@Repository对Dao进行注解
(4)service 层使用@Resource注入Dao,byName
(5)@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法。通俗来说,被Controller标记的类就是一个控制器,这个类中的方法,就是相应的动作。
(6)@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,我们也要清楚,@Autowired是根据类型进行自动装配的。
Spring注解