Spring Framework原理

Spring Framework

java中创建对象的方法:

  1.  构造方法,new student()

  2.  反射

  3. 序列化

  4. 克隆

  5. IOC:容器创建对象(不需要在代码中创建对象)

  6. 动态代理

ioc的体现:

    servlet:

        1.  创建类继承HttpServelt

        2.  在web.xml注册servlet,使用<servlet-name> myservlet </servlet>

                                                        <servlet-class> com.bjpwernode.controller.MyServlet </servlet-class>

        3. 没有创建servlet对象,没有MyServlet myservlet = new MyServlet()

        4. servlet是Tomcat服务器创建的。Tomcat也称为容器

            Tomcat作为容器,里面存放的右servlet对象,Listener,Filter对象

IoC的技术实现:

    DI 是IOC的技术实现

    DI(Dependency Injection): 依赖注入,只需要在程序中提供要使用的对象名称就可以

Spring使用di实现了IOC的功能,底层创建对象使用反射机制

spring是一个容器,管理对象,给属性赋值,底层是反射创建对象。

Spring中的bean

bean是根据scope来生成,表示bean的作用域,scope有4中类型:

    

    singleton,单例,表示通过Spring容器获取的对象是唯一的

    

    prototype,原型,表示通过Spring容器获取的对象是不同的

    request,请求,表示在一次http请求内有效

    session,回话,表示在一个用户会话内有效

request,session适用于Web项目

singleton模式下,只要加载IoC容器,无论是否从IoC中取出bean,配置文件中的bean都会被创建。

 prototype模式下,如果不从IoC中取bean,则不创建对象,取一次bean,就会创建一个对象

Spring的继承

    spring的继承不同于java中的继承,区别:java中的继承是区别于类的,spring的继承是针对对象(bean)

    spring中的继承,子bean可以继承父bean中的所有成员变量的值。

    通过设置bean标签的parent属性建立继承关系,同时子bean可以覆盖父bean的属性值。

    spring的继承是针对对象的,所以子bean和父bean并不需要属于同一个数据类型,只要其成员变量列表一致即可。

Spring的依赖

IoC容器默认情况下是通过spring.xml中的bean配置顺序来决定创建顺序的,配置在前面的bean会先创建。

在不更改spring.xml配置顺序的前提下, 通过设置bean之间的依赖关系(depends-on)来调整bean的创建顺序

Spring读取外部资源:

数据库的配置文件一般保存在以properties为后缀的文件中,

Spring P 命名空间

Spring 工厂方法:

IoC通过工厂模式创建bean:

   

     静态工厂方法(不需要实例化)

        factory-method指向静态方法

        constructor-arg的value属性是调用静态方法传入的参数

    实例工厂方法(需要实例化)

        

区别:静态工厂方法创建Car对象,spring.xml中只需要配置一个bean,即最终的结果Car即可;

            实例工厂方法创建Car对象,spring.xml中需要配置两个bean,一个是工厂bean,一个是Car bean

Spring IoC 自动装载autowire

自动装载是Spring提供的一种更加简便 的方法完成DI,不需要手动配置property,IoC会自动选择bean完成注入。

有两种方式:

    byName

    byType

Spring IoC基于注解的开发

  1. 配置自动扫包

  2. 添加注解

基于注解的方式,默认的类名称的首字母小写    

DI操作使用@Autowire注解

@Autowire默认是通过byType进行注入的,如果要改为byName,需要配置@Qualifier注解完成。

表示将IoC中id为ds的bean注入到repository中

实体类中普通的常用变量可以通过@Value注解进行赋值

实际开发中程序会分三层

Controller

Service

Repository(DAO)

@Compoment注解是将标注的类加载到IoC容器中,实际开发中可以根据业务需求分别使用@Controller、@Service、@Repository注解来标注控制层类、业务层类、持久层类。

Spring IoC底层原理

核心技术点:XML解析 + 反射

具体思路:

  1. 根据需求编写XML文件,配置需要创建的bean

  2. 编写程序读取XML文件,获取bean相关信息,类、属性、id

  3. 根据第2步获取到的信息,结合反射机制动态创建对象,同时完成属性的赋值

  4. 将创建好的bean存入Map集合,设置key-value映射,key就是bean中id值,value就是bean对象

  5. 提供方法从Map中通过id获取对应的value

Spring AOP(Asprct Oriented Programming)面向切面编程:

AOP是对OOP的一个补充,是在另一个维度上抽象出对象。

具体是指程序运行时动态地将非业务代码切入到业务代码中,从而实现程序的解耦合,将非业务代码抽象成一个对象,

对对象编程就是面向切面编程。

AOP的有点:

    可以降低模块之间的耦合

    提高代码的复用性

    提高代码的维护性

    集中管理费业务代码,便于维护

    业务代码不受非法业务代码的影响,逻辑更加清晰

@Component,将切面类加载到IoC容器中

@Aspect,表示该类是一个切面类

@Before,表示方法的执行时机是在业务方法之前,execution表达式表示切入点

@After

@AfterReturning

@AfterThrowing

aop:aspectj-autoproxy,Spring IoC容器会结合切面对象和委托对象自动生成动态代理对象,AOP底层是通过动态代理机制实现的。

AOP概念:

    切面对象:根据切面抽象出来的对象,Callmpl所有方法中需要加入日志的部分,抽象成一个切面类LoggerAspect

    通知:切面对象具体执行的代码,即非业务代码,

    目标:被横切的对象,将通知加入其中

    代理:切面对象、通知、目标混合之后的结果,即我们使用JDK动态代理机制创建的对象

    连接点:需要被横切的位置,即通知要插入业务代码的具体位置

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值