Spring快速入门
spring框架:解决对象的创建和对象之间的依赖关系
IOC(控制反转):对象的创建教给外部容器来完成
DI(依赖注入):对象创建后,处理对象之间的依赖关系
AOP(面向切面):关注点代码与业务代码分离
- 关注点:重复的代码(方法)(例如事务开关)
- 切面:关注点形成的类
- 连接点:
- 切入点:
核心模块:
beans.jar core.jar content.jar expression.jar 依赖包 commons-logging
核心配置文件:application.xml
bean创建的细节
以xml方式为例
1.对象创建:(创建时默认单例)
单例scope=“singleton” : 容器启动时创建 (是否延时创建 默认lazy-init = false)
多例scope=“protoType” : 使用对象时创建
2.初始化和销毁:(通过下面的属性指定初始化和销毁方法)
init-method=“init”
destory-method=“destory”
IOC的创建方式
1.xml:无参构造、带参构造
在这里插入图片描述
2.工厂创建:
非静态:工厂类实例,在指定工厂bean和工厂方法
静态:工厂class和工厂方法
3.FactoryBean方式:
实现FactoryBean接口
重写方法:getOject(){return new Car();}
getObjectType(){return Car.class;}
isSingleton(){return true;}
DI注入
1.构造方式
2.set方式属性注入:userDao作为UserService的一个属性 需要实现set方法
3.P名称空间
xmlns:p=“http://www.springframework.org/schema/p”
4.自动装配(不利于后期维护 不推荐)
aotowire=“byName”、aotowire=“byType”
5.注解的方式(重要)
a.引入context名称空间
b.开启注解扫描<context:component-scan base-package=“要扫描的包名” />
注解:
@Component(name=“userDao”) 括号内不赋值时,默认类名首字母小写
@Resource(name=“userDao”) 默认type的方式进行自动装配
Component:Controller(控制层) service(service业务逻辑层)repository(Dao持久层使用)
在WEB项目中集成Spring
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/application*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
AOP
注解的方式实现:
- 导包:aopaliance.jar/aspectj.weaver.jar、spring-aspects.jar
- 开启声明:aop:aspectj-autoproxy/
- 切面类首先要加入到ICO容器中@component 且 @Aspect
- 切入点表达式:
@before(“execution(pulic void com.test.qpy.TestClass.test(String test))”)
@before(“execution(* com.test.qpy..(…))”)
第一个*:任意修饰符和返回值
第二个*:任意类
第三个*:任意方法
…:点点代表任意数量参数
通知方式:Before After AfterRunning AfterThrowing Around
代理的实现
动态代理(JDK代理):需要Object target实现接口
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyUtile {
private Object target;
public ProxyUtile(Object target) {
this.target = target;
}
public Object getProxInstance() {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(), //类加载器
target.getClass().getInterfaces(), //类实现的接口
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("事务开始");
Object result = method.invoke(target, args);
System.out.println("事务结束");
return result;
}
});
}
}
子代理(cglib):当类不存在接口时使用
- 引用jar文件—Spring Core核心包
- 目标对象不能为final
- 目标方法不能是final、static修饰,否则不会拦截
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class ProxyFactory implements MethodInterceptor {
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxInstance() {
Enhancer en = new Enhancer();
en.setSuperclass(target.getClass());
en.setCallback(this);
return en.create();
}
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println("事务开始");
Object result = arg1.invoke(target, arg2);
System.out.println("事务结束");
return result;
}
}
Spring 对JDBC的支持
- 连接池 CombopooledDataSource
- JDBC Template 工具类
- 导包:
spring-jdbc、spring-tx、c3p0、mysql-connector
spring事务管理
事务管理
- 编程式事务:conn.setAutoCommit(false)
- 声明式事务:AOP方式
事务的管理
xml方式:
1.配置事务管理器 DataSourceTransactionManager
2.配置事务管理增强 tx:advice
3.配置AOP(切入点表达式)+应用事务管理增强
注解的方式
1事务的声明:<tx:annotation-driven transaction-manager=“txManage”/>
2@transactional 可放在方法和类前
IOC的原理
1.dom4j解析xml文件,根据id获取class的属性值
String classValue = “Class属性值”;
2.反射创建类对象
User user = class.forNmae(classValue);
3.创建类对象
User user = class.newInstance();
Spring中bean的作用域
- singleton
- prototype
- request
- session
- global session
IOC容器中bean的生命周期
- 初始化IOC容器
- 通过构造器或工厂方法创建bean的实例
- 为bean的属性设置值或者对其它bean的引用
- 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
- 调用bean设置的初始化方法
- 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
- 使用bean
- 容器关闭时,调用bean的销毁方法,然后关闭容器
注:bean的后置处理器需要实现beanPostProcessor接口