Spring的实现原理剖析(自己总结版,大家来补充)

来源:互联网 发布:阿里云东京节点 编辑:程序博客网 时间:2024/06/05 11:09

1.  Spring包含IOC(控制反转)和AOP(面向切面编程)

IOC指的是应用本身不负责依赖对象的创建和维护,依赖对象的创建和维护由外部容器负责。

2.  那么Spring是怎样进行创建bean、管理bean和进行依赖注入的呢?

首先分析通过xml配置的方式:

首先容器使用dom4j读取beans..xml文件,把id和className保存到对象中,使用类名通过反射创建class的实例。并且把id和类的实例放到map中方便存取,这样就实现创建和管理bean了。接下类就是依赖注入通过dom4j把property属性的name和ref放到另一个对象中,通过遍历类实例的属性描述符和xml属性的配置信息,判断xml中有相关的配置,就通过反射调用属性的set方法,来为其赋值。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
           <bean id="personDao" class="cn.itcast.dao.impl.PersonDaoBean"></bean>
          <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean">
          <property name="personDao" ref="personDao"></property>
          </bean>
</beans>

其次是通过注解的方式:

首先要开发一个注解

@Retention(RetentionPolicy.RUNTIME)//注解的作用范围是在运行过程中

@Target({ElementType.FIELD,ElementType.METHOD})//作用目标是字段和方法

public @interface MyResource{

public String name(){} default " ";

}

然后给注解在自己编写的容器中写好解析器,开发的注解就像xml一样只有配置作用,有了解析器才会实现注入的功能。

解析器:得到实例bean的所有属性和字段,通过反射技术判断他们上面有没有注解(其实就是通过一个方法,即setter.isAnnotationPresent(ItcastResource.class)){//采用反射技术判断set方法上面是否有ItcastResource注解),如果有则通过反射技术得到这个注解(setter.getAnnotation(ItcastResource.class);//得到set方法上的这个注解),在判断注解上面有没有name属性,如果有就通过map找到对应的实例,通过属性或字段的set方法进行注入。

如果没有则按照默认的属性名或者字段名来查找是否有对应的bean,通过属性或者字段的set方法完成注入。如果没有就按照属性或字段的类型进行查找是否有对应的bean,通过属性或者字段的set方法完成注入。

3.AOP切面编程

依靠动态代理实现的AOP,动态代理中的一个重要的方法

Object proxyObject=Proxy.newProxyInstance(ClassLoader classLoader,Class[] interfaces,InvocationHandler h);



0 0
原创粉丝点击