您的位置:首页 > 编程语言 > Java开发

Spring核心之IOC&反射

2015-02-02 22:27 155 查看
什么是依赖:Spring 把相互协作的关系称为依赖关系。假如 A 组件调用了 B 组件的方法,我们可称A 组件依赖于 B 组件

IOC思想:Spring容器来实现相互依赖对象的创建,协调工作。对象只需要关心业务逻辑本身就好了。从这方面来说,对象如何得到他的协作对象的责任被反转了(IOC、DI)。控制反转就是获得依赖对象的方式反转了由Spring来负责控制对象的生命周期和对象间的关系

创建被调用者实例的工作通常由Spring 容器来完成,然后注入给调用者,因此也称为依赖注入

依赖注入的 Spring 实现

1、设值注入:设值注入是指 IoC 容器使用属性的 setting 方法来注入被依赖的实例。

2、构造注入:除了设值注入,还有另一种注入方式,这种方式在构造实例时,已为其完成了依赖关系的初始化。这种利用构造器来设置依赖关系的方式,被称为构造注入。

两种注入方式的对比

1、相比之下,设值注入具有如下的优点:

(1)、与传统的 JavaBean 的写法更相似,程序开发人员更容易理解、接受。通过 Setting 方法设定依赖关系显得更加直观、自然。
(2)、对于复杂的依赖关系,如果采用构造注入,会导致构造过于臃肿,难以阅读。Spring 在创建 Bean 实例时,需要同时实例化其依赖的全部实例,因而导致性能下降。而使用设值注入,则能避免这些问题。
(3)、尤其是在某些属性可选的情况下,多参数的构造器更加笨重。

2、构造注入也不是绝对不如设值注入,在某些特定的场景下,构造注入比设值注入更优秀。构造注入也有如下优势:

(1)、构造注入可以在构造器中决定依赖关系的注入顺序,有限依赖的优先注入。例如,组件中某些其他依赖关系的注入,尝尝需要依赖于 Datasource 的注入。采用构造注入,可以在代码中清晰地决定注入顺序。
(2)、对于依赖关系无须变化的 Bean ,构造注入更有用处。因为没有 setting 方法,所有的依赖关系全部在构造器内设定。因此,无须担心后续代码对依赖关系产生的破坏。
(3)、依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系完成透明,更符合高内聚的原则。

两种方式总结:建议采用以设值注入为住,构造注入为辅的注入策略。对于依赖关系无须变换的注入,尽量采用构造注入;而其他的依赖关系的注入,则考虑采用设值注入

参考:http://blog.csdn.net/a906998248/article/details/7514085

IOC(控制反转)之中的核心是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。

那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

ApplicationContext context = new FileSystemXmlApplicationContext( "applicationContext.xml");

A a = (A) context.getBean("a");

pojo类的属性也是可以通过Spring注入进去的。Spirng不但可以注入基本类型,而且可以注入像List,Map这样的类型。

Map类型的配置:

public static void printMethods(Class cl)
{
Method[] methods =cl.getDeclaredMethods();//返回一个包含方法对象的数组
for(Method m : methods)//循环该类的每个方法
{
Class retType = m.getReturnType();//该方法的返回类型,
Sting name = m.getName();//获得方法名
Systen.out.print(" "+Modifier.toString(m.getModifiers());打印方法修饰符
System.out.print(" "+retType.getName() + " " + name +"(");

Class[] paramTypes = m.getParameterTypes();//获得一个方法参数数组(getparameterTypes用于返回一个描述参数类型的Class对象数组)

for(int j = 0 ; j < paramTypes.length ; j++)

{
if ( j > 0 ) System.out.print(" , ");   //如果有多个参数,中间则用逗号隔开,否则直接打印参数
System.out.print (paramTypes[ j ].getName);
}
System.out.println (" );");
}}

//////////getparameterTypes方法用于返回一个描述参数类型的Class对象数组)


View Code

参考文献:
http://blog.csdn.net/a906998248/article/details/7514085 http://blog.csdn.net/it_man/article/details/4402245
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: