Spring,DI和AOP

Spring简介

Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。

Spring总结起来优点如下:

低侵入式设计,代码的污染极低。

独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺。

Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦。

Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。

Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。

Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。

Spring的DI

DI:依赖注入,一个BookService类的功能需要依赖另外一个BookDao类配合,同时需要赋上一

个具体的对象,则成这种关系是依赖注入;

IOC:控制反转,以前依赖的对象自己直接new,现在不需要new,框架会自动注入对象,创建对

象的权利转移给了框架;

spring框架负责所有对象的创建、管理和依赖注入;所有的对象存储的容器叫做IOC容器;

Spring的AOP

AOP(Aspect Orient Programming)也就是面向切面编程,作为面向对象编程的一种补充,已经成为一种比较成熟的编程方式。其实AOP问世的时间并不太长,AOP和OOP互为补充,面向切面编程将程序运行过程分解成各个切面。

为什么需要AOP

AOP专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在JavaEE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案。

使用AspectJ实现AOP

AspectJ是一个基于Java语言的AOP框架,提供了强大的AOP功能,其他很多AOP框架都借鉴或采纳其中的一些思想。其主要包括两个部分:一个部分定义了如何表达、定义AOP编程中的语法规范,通过这套语法规范,可以方便地用AOP来解决Java语言中存在的交叉关注点的问题;另一个部分是工具部分,包括编译、调试工具等。

AOP实现可分为两类:

静态AOP实现: AOP框架在编译阶段对程序进行修改,即实现对目标类的增强,生成静态的AOP代理类,以AspectJ为代表。

动态AOP实现: AOP框架在运行阶段动态生成AOP代理,以实现对目标对象的增强,以Spring AOP为代表。

一般来说,静态AOP实现具有较好的性能,但需要使用特殊的编译器。动态AOP实现是纯Java实现,因此无须特殊的编译器,但是通常性能略差。

AOP的基本概念

关于面向切面编程的一些术语:

切面(Aspect): 切面用于组织多个Advice,Advice放在切面中定义。

连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用,或者异常的抛出。在Spring AOP中,连接点总是方法的调用。

增强处理(Advice): AOP框架在特定的切入点执行的增强处理。处理有"around"、"before"和"after"等类型

切入点(Pointcut): 可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。

1. 创建项目,导入 spring jar包,按照如下目录结构创建接口及其实现类。

首先是dao层的包和接口

package com.zh.dao.impl;

public class SeriverDao implements com.zh.dao.SeriverDao {
    @Override
    public void Aad() {
        System.out.println("sdad");
    }
}

service层的包和接口

package com.zh.serivce.impl;

import com.zh.dao.SeriverDao;

public class Booksesiver implements Bookserivce{
    private SeriverDao seriverDao ;
    private  String name;
    private  int age;


    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setSeriverDao(SeriverDao seriverDao) {
        this.seriverDao = seriverDao;
    }

    @Override
    public String toString() {
        return "Booksesiver{" +
                "seriverDao=" + seriverDao +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public void aa() {
        System.out.println(toString());
        seriverDao.Aad();
    }

}

2. 使用 spring 完成 IOC 的配置和 DI 依赖注入, 创建 spring 的核心配置文件

 <?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.xsd">
  <bean id="seriverDao" class="com.zh.dao.impl.SeriverDao"/>
  <bean id="bookserivce" class="com.zh.serivce.impl.Booksesiver">
    <property name="name" value="是多少撒大声地"/>
    <property name="age" value="20"/>

    <property name="seriverDao" ref="seriverDao"/>
  </bean>
</beans>

然后测试

package com.zh.tese;

import com.zh.serivce.impl.Bookserivce;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test01 {
  Bookserivce bookserivce;
  @Test
  public void  test01(){
      ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("serivce.xml");
      Bookserivce bookserivce = (Bookserivce) context.getBean("bookserivce");
           bookserivce.aa();
  }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值