IOC:
就是把创建对象的工作交给SPRING来生成,处理,装配
IOC的创建时机:
在xml配置文件加载的时候,容器中的管理对象就初始化了
DI依赖注入:
是实现IOC的一种方法。
6.1构造器注入
6.2Set注入【重点】
- 依赖注入:Set注入
-
- 依赖 bean对象的创建依赖于容器
-
- 注入 bean对象大众的所有属性 由容器来注入!
【环境搭建】
1.复杂类型
2
- 注入 bean对象大众的所有属性 由容器来注入!
spring的ioc容器注入注解
@Comment
但是这个注解可以有多重命名,来适应MVC结构
- Dao层 用@Repository
- Serivce层 用@Service
- Controller层 用@Controller
以上注解功能都是一样的,都是代表将某个类注册到IOC容器中由Spring管理,装配Bean
小结:xml和注解
xml更加灵活多功能,方便配置,能够配置所有bean,多个bean
注解只能配置当前类
最佳实现:
由xml管理beans,由注解注入bean的属性
注意:
SpringMVC中,想要使用注解,必须要在xml中配置扫描包和注解支持
spring 中的DI
把bean注入到IOC中,就需要DI把IOC里面的实例拿出来使用,这里就会用到
@Autowired 注解
通俗来讲就是@Comment把对象实例放入到IOC由@Autowired来取用
在Spring4后java配置变成了核心功能
@Configuration
代替了配置xml,代替了beans
用Configuration往IOC中注入实例的话有两种方法
1:
@Bean 【手动添加单个实例到IOC中】
这里的方法名(下面方法中的getUser())代表了bean标签中的id属性
这里的返回值(下面方法中的User类)代表了bean标签中的class属性
@Bean
public User getUser(){
return new User();
}
2:
@ComponentScan(“扫描的包路径”)
自动扫描 路径包下的所有类注入到IOC容器中
@Import(“类.class”) 可以把其他类导入到同一个类里
代理模式
静态代理
角色分析:
- 抽象角色:接口或者抽象类
- 真实角色:需要被代理的角色
- 代理角色:代替真实角色的角色
- 客户:访问代理对象的角色
优点
- 可以使真实角色的操作更加纯粹!不再去关注一些公共服务
- 将公共服务交给代理角色,实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
缺点:
- 一个真是角色就会产生一个代理角色,代码量会翻倍,开发效率会变低
声明式事务
Spring 的声明式事务大致分为三步
- 添加tx约定
- 配置AOP的事务通知类型
- 配置AOP的事务切点
在SpringBoot中不用配置,注解即可实现
小结
本次知识重温,再次重点了解一下原理:
- IOC的思想
- IOC的实现
- AOP的原理
- 代理模式 静态/动态
- 切面的组成,切点,通知,连接点的意义
- AOP的注解使用 连接点的种类
- Spring对事务的支持原理
Java 动态代理
接口
public interface Service {
public void add();
public void del();
public void edit();
public void query();
}
接口实现类
public class ServiceImpl implements Service {
public void add() {
System.out.println("添加");
}
public void del() {
System.out.println("删除");
}
public void edit() {
System.out.println("编辑");
}
public void query() {
System.out.println("查询");
}
}
实现InvocationHandler的实现类
public class ServiceInvHandler<T> implements InvocationHandler {
public T targer;
public ServiceInvHandler(T targer) {
this.targer = targer;
}
/**
* proxy 为动态代理类
* method 为当前调用的方法
* args 为当前方法传入的参数
**/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法:"+method.getName());
// 需要被代理的对象 和 传入的方法 进行方法调用
Object invoke = method.invoke(targer, args);
System.out.println(System.currentTimeMillis());
return invoke;
}
}
调用代理对象实现动态代理
public class Client {
public static void main(String[] args) {
//实例化 接口实现类
Service service = new ServiceImpl();
//实例化 一个invocation实现类
InvocationHandler invHandler = new ServiceInvHandler<Service>(service);
//实例化 一个代理类的实例 并强转为接口类
/**
* var1 接口的类加载器
* var2 反射获取的接口数组参数
* var3 获取代理对应的InvocationHandler实例
**/
Service proxy =(Service) Proxy.newProxyInstance(Service.class.getClassLoader(), new Class[]{Service.class}, invHandler);
// 代理调用方法
proxy.add();
}
}