spring6
1.简单工厂模式。
优点:客户不需要了解具体bean的具体创建细节 实现了责任分离
缺点:a.违背了OCI原则 假设要产生一个新的产品 则需要修改原来的代码
b.安全性差 工厂bean一旦产生任何问题 系统将会瘫痪
2.工厂方法模式
组成: 抽象工厂 具体工厂 抽象产品 具体产品
优点:实现了OC原则
缺点: 容易产生类爆炸的问题,一定程度上增加了类与类关系的复杂度 这并不是什么好事
3.bean的创建方式
3.1构造方法创建
3.2简单工厂创建 :使用factoty-method来实现(静态)
3.3factory-bean 创建(工厂方法模式):使用factory-bean 和 factory-method来实现
3.4 factory-bean接口创建:当你要创建的类实现了FactoryBean接口 此时就不需要指定factory-bean属性 和 factory-method的属性 spring自动调用
4.BeanFactory 和 FactoryBean的区别
1.BeanFactory:是Ioc容器的顶级对象 是一个工厂,负责创建bean对象
2.FacotryBean:是一个bean 是辅助spring实例化对象的一个Bean 在spring中 bean 可以分为两类;第一类为普通bean 第二类为工厂bean(工厂bean也是bean)
5.bean的生命周期
1.五步:
实例化对象(执行构造方法)->给属性赋值->调用init方法(自己定义)->使用bean->销毁bean
2.七步:
实例化对象(执行构造方法)->给属性赋值->执行bean处理器的'before'方法->调用init方法(自己定义)->执行bean处理器的'after'方法->使用bean->销毁bean
ps:bean处理器需要单独定义,实现BeanPostProcessor接口,一旦被定义,则spring在创建每个bean时都会执行before和after方法
3.十步:
实例化对象(执行构造方法)->给属性赋值->检查bean是否实现了Aware相关接口,并调用接口方法->执行bean处理器的'before'方法->检查bean是否实现了InitializingBean接口,并调用接口方法->调用init方法(自己定义)->执行bean处理器的'after'方法->使用bean->检查bean是否实现了DisposableBean接口,并调用接口方法->销毁bean
ps:可以实现多个相关接口,因此在上述橙色标记的生命周期中,可以执行不止一个方法.
4:补充
当bean不是单例模式时(pototype) spring容器只负责将该bean初始化完成(使用bean之前),当客户端获得该bean时,spring就不在管理.
5.自己new的bean如何纳入spring容器管理
DefaultListableBeanFactory a = new DefaultListableBeanFactory();
a.registerSingleton("beanName");
a.getBean("beanName");
6.bean的循环依赖
1.什么是循环依赖
A类依赖B类,B类依赖A类.
2.singleton + set依赖注入是没有问题的原因(spring是如何解决的)
在这种模式下!!!,spring对bean的管理分为清晰的两个阶段:
阶段一:spring容器在创建bean之后,不等给其属性赋值,就立刻将该bean曝光
阶段二:曝光之后,再对bean进行赋值
3.prototype+set依赖注入不支持循环依赖
4.构造注入模式下也不支持循环依赖
5.spring底层解决循环依赖源码:
spring底层有三个map缓存:
private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16);
*singletonObjects:一级缓存,存放完整的Bean对象(属性已经被赋值).
*singletonFactories:二级缓存,存放早期的bean对象(属性还未被赋值)
*earlySingletonObjects:三级缓存,存放创建每一个Bean的工厂对象.
Object bean = instanceWrapper.getWrappedInstance();
*创建Bean
this.addSingletonFactory(beanName, () -> {
return this.getEarlyBeanReference(beanName, mbd, bean);
});
*提前曝光Bean
this.populateBean(beanName, mbd, instanceWrapper);
*给Bean赋值
7.Ioc注解开发
1.bean注解:
Compoent Controller Service Reposity
2.给简单类型赋值注解@Value
位置:属性 set方法 构造器 参数
3.给引用类型赋值
@Autoweird:根据类型 注入 当该类只有一个构造方法 而且方法上有属性参数是 该注解可以省略
@Qulifiar 与@Autowired 一起使用 代表用名字注解
@Resource 用名字注解 是JDK扩展包中的注解 建议使用这个 默认会使类名首字母小写
8.代理模式
1.什么是代理模式?
代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不应该看到的内容和服务或者添加客户需要的额外服务。 通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通过引入代理对象来间接访问一个对象,这就是代理模式的模式动机。
2.静态代理
静态代理中有三个对象 :接口对象 目标对象 代理对象 。后两个需要实现接口对象中的方法,并在代理对象中注入目标对象(称为泛型关系,不使用继承是因为继承会使代码耦合度变高)
缺点:导致雷爆炸
3.动态代理
动态代理有两种方式 JDK 和CJLIB
JDK :只能代理接口 即只能代理接口实现的类
CJLIB: 既可以代理接口 又可以代理类 底层采用继承的方式实现 所以目标对象不能用final修饰
9 面向切面编程--AOP
1.AOP是一种思想 其主要用于解决交叉业务的问题 使程序员在编写代码时将注意力更多的放在业务本身,而不是像日志管理 事务 安全等这些与系统业务无关的交叉业务上
2.AOP 七大术语
连接点(joinPoint):可以放入交叉业务代码的位置
切点(pointCut)在程序执行流程中 ,可以织入切面的位置
通知:将要织入的代码 分为前置通知 后置通知 环绕通知 异常通知 最终通知
切面:通知+切点
织入 Weaving 把通知应用到目标对象上的过程。
代理对象 Proxy一个目标对象被织入通知后产生的新对象。
目标对象 Target 被织入通知的对象。
3.切入点表达式:用来描述往哪些方法上织入代码
4.AOP是一种思想 Spring对这种思想的实现有三种方式:
第一种方式:Spring框架结合AspectJ框架实现的AOP,基于注解方式。
第二种方式:Spring框架结合AspectJ框架实现的AOP,基于XML方式。
第三种方式:Spring框架自己实现的AOP,基于XML配置方式。
Java基础
1.一个类在初始化时 ,先按照定义的顺序执行静态域(静态变量和静态代码块),在按照定义的顺序执行普通变量和代码块,最后执行构造方法
2.内部类有四种
局部内部类 匿名累不累 成员累不累 静态累不累
算法
二进制求和:在遇到数字字符参与整数运算时 可以把数字字符与字符0相减
加一
以上两道题中都有遍历数组进位的问题 注意区别.
ps.累死了 多多重复百炼成钢 加油!