创建对象的几种方式

new、反射、反序列化、clone

反射

反射概念:
提供一个 Class对象 ,可以获得这个类对象的所有属性和方法

反射优劣势:
增加程序灵活,代码简洁,增强可读性,提高代码复用
量大时性能下降(安全权限检查 newInstance、class.forName JNI)、内部暴露和安全隐患

Class包含:

包(Package)
构造方法(Constructor)
字段(Filed)
函数(Method)
注解(Annotation)
接口
父类    
修饰符 ...

clazz.getFields(); //获取类中所有的公有字段,包括集成
clazz.getDeclaredFields(); //获取类中定义的字段

clazz.getModifiers(); //获取类中所有的公有方法,包括集成
clazz.getDeclaredModifiers(); //获取类中定义的方法
getModifiers() //获取修饰符
invoke()

clazz.getDeclaredConstructors() //获取所有构造方法

IOC,DI

IOC:控制反转,对象实例创建的控制权交给程序(IOC 容器:K-V HashMap)
DI:依赖注入,对象构建的过程当中,IOC 动态的提供对象需要的其他对象

Spring IOC 容器中对象的创建方式:

构造器、静态工厂方法、实例工厂方法

Spring DI 的几种方式:

有参的构造器、setter函数

Bean 规范

类 -> 是公有修饰 public
类 -> 具有 public 默认构造函数
类 -> 属性访问修饰是 private,需要有public(setter,getter)

spring 配置元数据

  • 基于XML的配置文件
  • 基于注解的配置
  • 基于JAVA的配置
    class
    name
    scope
    constructor-arg
    properties
    autowiring mode
    lazy-initialization mode
    initialization
    destruction

作用域

singleton、prototype、request、session、global-session
WebApplicationContext可用(request、session、global-session)

生命周期

init-method:InitializingBean 不建议使用
destroy-method:DisposableBean 不建议使用

1
2
3
4
AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");

context.registerShutdownHook();

XML -> beans 配置默认的初始化和销毁方法
default-init-method="init"
default-destroy-method="destroy"

后置处理器

BeanPostProcessor
调用初始化方法前后对 Bean 进行额外的处理
通过设置 BeanPostProcessor 实现的 Ordered 接口提供的 order 属性来控制这些 BeanPostProcessor 接口的执行顺序

定义继承

1
2
3
4
5
6
7
8
9
10
<bean id="beanTeamplate" abstract="true">
<property name="message1" value="Hello World!"/>
<property name="message2" value="Hello Second World!"/>
<property name="message3" value="Namaste India!"/>
</bean>

<bean id="helloIndia" class="com.tutorialspoint.HelloIndia" parent="beanTeamplate">
<property name="message1" value="Hello India!"/>
<property name="message3" value="Namaste India!"/>
</bean>