Spring 概念理解

IOC:

就是把创建对象的工作交给SPRING来生成,处理,装配

IOC的创建时机:

在xml配置文件加载的时候,容器中的管理对象就初始化了

DI依赖注入:

是实现IOC的一种方法。

6.1构造器注入

6.2Set注入【重点】

  • 依赖注入:Set注入
    • 依赖 bean对象的创建依赖于容器
    • 注入 bean对象大众的所有属性 由容器来注入!
      【环境搭建】
      1.复杂类型
      2

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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值