1.概念
IOC(控制反转)是一种设计思想,旨在实现调用类和实现类的松耦合,调用类只依赖接口,在编译阶段并不知道具体使用哪个实现类,而是将这个控制权交给第三方容器,在运行时由容器将实例变量(具体的实现类)注入到对象中(调用类)。
DI(依赖注入)是具体的实现技术,是指由第三方组件负责将实例变量(实现类)传入到对象(调用类)中去。
2.IoC的两种设计模式
2.1 反射:在运行状态中,根据提供的类的路径或类名,通过反射来动态地获取该类所有属性的方法
2.2 工厂模式:把IoC容器当作一个工厂,在配置文件或注解中给出定义,然后利用反射技术,根据给出的类名生成相应的对象
3.DI的两种注入方式
3.1构造器注入
构造器注入是在Bean构造过程中执行的
3.2 Setter注入
Setter注入是在Bean示例创建完毕之后执行
4.总结
Spring引入Autowire(自动装配)机制就是为了解决<bean>标签下<property>标签或<constructor-arg>标签过多的问题
对于强依赖,可使用构造器注入,对于弱依赖,推荐使用Setter注入
5.课后
5.1什么是反射
JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态语言的一个关键性质。
Java反射的功能是在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。
5.2反射的用途
当我们在使用 IDE(如 Eclipse\IDEA)时,当我们输入一个队长或者类并向调用它的属性和方法时,一按 (“.”)点号,编译器就会自动列出她的属性或方法,这里就会用到反射。
5.3反射的实例
获取对象的类型名称
publicclassReflectionHelloWorld{publicstaticvoidmain(String[] args){ Foo f = newFoo(); System.out.println(f.getClass().getName()); }}classFoo{publicvoidprint(){ System.out.println("abc"); }}
输出结果
myreflection.Foo
调用未知对象的方法
publicclassReflectionHelloWorld{publicstaticvoidmain(String[] args){ Foo f = newFoo(); Method method;try{ method = f.getClass().getMethod("print",newClass[0]); method.invoke(f); }catch(Exception e) { e.printStackTrace(); } }}classFoo{publicvoidprint(){ System.out.println("abc"); }}
输出结果
abc
创建对象
publicclassReflectionHelloWorld{publi cstaticvoidmain(String[] args){// 创建Class实例Class c =null;try{ c=Class.forName("myreflection.Foo"); }catch(Exception e){ e.printStackTrace(); }// 创建Foo实例Foo f =null;try{ f = (Foo) c.newInstance(); }catch(Exception e) { e.printStackTrace(); } f.print(); }}classFoo{publicvoidprint(){ System.out.println("abc"); }}
输出结果
nullabc