1. 介绍spring之 IOC
控制反转(Inversion of Control) 简称为IOC,是面向对象编程的一种设计原则,可以用来减低代码之间的耦合度,其中最常见的实现方式叫做DI(依赖注入)。
控制反转:之前的所有对象都是由我们在程序之中手动new出来的,而使用spring之后我们所有的对象都有spring容器去创建,我们需要使用的时候只需要从容器中获取即可(反转创建对象的权利)。
依赖注入:spring在创建对象的过程中,将对象中所依赖的属性注入到对象之内(给创建的对象赋值)。
2. 介绍spring 之 AOP
AOP能够将与业务无关,但是又被所有业务模块共用的代码抽离出来,使用动态代理技术在容器的运行期间,动态的织入其中,减少重复代码,降低耦合度,提升系统的可维护性。
3. 什么是代理模式
代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。
4. 手写静态代理代码案例
接口类:
/**
* 接口,对象类和代理类都要实现这个接口(在本例中是卖房子)
* @author Administrator
*
*/
public interface LetOutService {
Integer letOut();
}
目标类:
/**
* 目标类(在本例中是房东)
* @author Administrator
*
*/
public class Landlady implements LetOutService{
@Override
public Integer letOut() {
System.out.println("出租房子进行时......");
return 1000;
}
}
代理类:
/**
* 代理类,在本例中是房屋中介
* @author Administrator
*
*/
public class Proxy implements LetOutService{
//被代理的对象(倒霉房东)
private LetOutService letOutService;
//构造方法
public Proxy(LetOutService letOutService) {
//对房东对象进行初始化
this.letOutService = letOutService;
}
//代理类的出租房子方法,必须加钱
@Override
public Integer letOut() {
//先执行房东对象的方法进行出租
Integer price = this.letOutService.letOut();
//然后把价格进行增加,500元的中介费
return price+500;
}
}
代理工厂类:
/**
* 代理工厂类,用来生成代理对象,也可以不使用,直接new处理对象
*
* @author Administrator
*
*/
public class ProxyFactory {
public static Proxy getProxy(Class class1) {
LetOutService letOutService;
try {
letOutService = (LetOutService) class1.newInstance();
return new Proxy(letOutService);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
用户类(测试类):
/**
- 租房子的用户类,马上就要被中介坑了
- @author Administrator
*/
public class User {
public static void main(String[] args) {
//先生成一个代理对象(找中介租房子)
Proxy proxy = ProxyFactory.getProxy(Landlady.class);
//调用代理对象的方法(中介报房价)
Integer price = proxy.letOut();
System.out.println("房子为:"+price+"元");
}
}
5. 什么是事务,事务的四个特性
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
6. spring管理的bean的生命周期
(实例化对象,注入属性.调用初始化方法,销毁对象(多例不负责销毁))
Spring在创建|销毁对象的时候我们可以在xml中指定其在创建|销毁对象时调用哪些初始化方法,以及销毁方法
init-method=“init” destroy-method=“close”
在创建对象的时候会执行init-method中的方法,容器关闭销毁对象的时候会执行destroy-method的方法,多例的对象Spring容器不负责销毁。
Spring创建对象的时机:
ApplicationContext:默认在加载xml文件的时候就创建了所有的对象(不包括实现FactoryBean接口),可以在bean标签内使用 lazy-init=“true” 来让对象延迟加载(什么时候get这个对象,什么时候创建)。
BeanFactory: 默认什么时候getBean 什么时候加载对象。
7. 依赖注入有哪五种方式
1:set注入(必须要有set方法)
2:构造器注入(要求必须有对应的构造器)
3:字段注入(最常用的方式)
4:接口注入(知道有就好)
// 5:类型注入(set注入)
8. 自动装配有哪两种方式
1:xml手动装配(常用)
2:xml装配
3:注解装配(常用)
9. spring框架中都用到了哪些设计模式
• 工厂设计模式(2)
• 单例设计模式(2)
• 代理设计模式 (2)
• 模板方法(1)
• 观察者模式(1)
• 适配器模式(1)
• 装饰者模式(1)
10. Spring管理事务的步骤
1、声明事务管理器
<bean id="txManage"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2、配置tx:advice通知,引用事务管理器
<tx:advice id="txAdvice" transaction-manager="txManage">
<tx:attributes> -->
<!-- 在这里写都有哪些方法需要使用事务 -->
<tx:method name="del*" />
</tx:attributes>
</tx:advice>
3、配置AOP切入点
配置aop:advisor使用上面的通知以及切入点
<aop:config>
<aop:pointcut expression="execution(* com.zhiyou.service..*(..))"
id="op" />
<!-- 使用上面的通知,以及我们配置的切入点 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="op" />
</aop:config>
4:开启事务注解驱动。
<tx:annotation-driven transaction-manager="txManage"/>