Spring基础——记录

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的支持

  1. 连接池 CombopooledDataSource
  2. JDBC Template 工具类
  3. 导包:
    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的作用域

  1. singleton
  2. prototype
  3. request
  4. session
  5. global session

IOC容器中bean的生命周期

  • 初始化IOC容器
  • 通过构造器或工厂方法创建bean的实例
  • 为bean的属性设置值或者对其它bean的引用
  • 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
  • 调用bean设置的初始化方法
  • 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
  • 使用bean
  • 容器关闭时,调用bean的销毁方法,然后关闭容器

注:bean的后置处理器需要实现beanPostProcessor接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值