漠北空城

听海观潮


  • 首页

  • 关于

  • 标签

  • 归档

  • 搜索

Spring-AOP简介

发表于 2017-11-28

Spring-AOP简介

spring面向切面编程

1、切面

事务、日志、安全性框架、权限等都是切面

2、通知

通知就是切面中的方法

1
2
3
4
5
6
7
8
9
10
11
// Transaction类为一个切面
public class Transaction {
// beginTransaction()方法为一个通知
public void beginTransaction(){
System.out.println("begin transaction");
}
// commit()方法为另一个通知
public void commit(){
System.out.println("commit");
}
}

3、切入点

1
2
3
4
5
6
7
8
9
10
11
12
13
if(method.getName().contains("save")
||method.getName().contains("update")
||method.getName().contains("delete")){
//1、开启事务
this.transaction.beginTransaction();
//2、完成目标方法
obj = method.invoke(this.target, args);
//3、事务的提交
this.transaction.commit();
}else{
//2、完成目标方法
obj = method.invoke(this.target, args);
}

在上面的代码中if语句块的内容就是切入点,只有满足了切入点以后,才能让通知和目标方法结合在一起

4、连接点

代理对象调用哪个方法,该方法就称为连接点(在程序执行过程中某一个特定的点)

5、织入:

形成代理对象方法体的过程,一个动作

6、说明:

  • 1、代理对象的方法=通知+目标方法
  • 2、除了目标方法以外的内容都可以看做切面中的通知(比如目标方法有CRUD,除了CRUD之外的都是通知,如开启事务、事务提交及事务回滚等)
  • 3、连接点代表了一个方法,在客户端被调用的一个方法(这个方法目标方法和代理对象中都存在)
  • 4、通知就是切面中的一个方法
  • 5、在开发的过程中,通知和目标方法完全是松耦合的

Spring-IOC-DI的意义

发表于 2017-11-26

Spring-IOC-DI的意义

通过做一个文档管理系统来展示spring-IOC-DI的意义

1、一般方式

步骤如下:

  • 1、建立一个接口Document,增加readDocument()和writeDocument()方法
  • 2、建立一个类WordDocument,实现Document接口,以及readDocument()和writeDocument()方法
  • 3、建立ExcelDocument,PDFDocument,同样实现Document接口
  • 4、做一个管理类DocumentManager
  • 5、客户端
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class DocumentTest {
    @Test
    public void test(){
    /**
    * 1、创建一个具体的文档对象
    * 2、创建DocumentManager对象
    * 3、调用read和 write方法
    */
    Document document = new WordDocument();
    DocumentManager documentManager = new DocumentManager(document);
    documentManager.read();
    documentManager.write();
    }
    }

2、用spring容器方式

步骤如下:

  • 1、建立一个接口Document,增加readDocument()和writeDocument()方法
  • 2、建立一个类WordDocument,实现Document接口,以及readDocument()和writeDocument()方法
  • 3、建立ExcelDocument,PDFDocument,同样实现Document接口
  • 4、配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <bean id="wordDocument" class="..."></bean>
    <bean id="excelDocument" class="..."></bean>
    <bean id="pdfDocument" class="..."></bean>
    <bean id="documentManager" class="...">
    <!-- 该属性是一个接口 -->
    <property name="document">
    <!-- 把这个对象给接口赋值 -->
    <ref bean="excelDocument"/>
    </property>
    </bean>
  • 5、客户端

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
    * 客户端完全不需要关系具体的实现类是哪个
    */
    @Test
    public void test_SPring(){
    ApplicationContext context =
    new ClassPathXmlApplicationContext("applicationContext.xml");
    DocumentManager documentManager =
    (DocumentManager)context.getBean("documentManager");
    documentManager.read();
    documentManager.write();
    }

在DocumentManager中,document接口的装配过程是由spring容器来完成的,客户端根本不知道这个过程

3、结论

通过普通的方式,在客户端中暴露了实现类,只是半面向接口编程;
通过spring的方式,在客户端只需要调用documentManager的API编程就可以完成调用,完全的做到了面向接口编程

spring 类扫描

发表于 2017-11-26

spring 类扫描

1、启动spring容器,spring容器会解析到以下配置

1
<context:component-scan base-package="..."></context:component-scan>

2、spring容器会在base-package包及子包中扫描所有的类

3、检查这些类中是否含有@Component注解

如果含有,则进行解析,
形式1:

1
2
3
4
@Component
public class Person{

}

这种形式的将会解析成:

1
<bean id="person" class="...">

形式2:

1
2
3
4
@Component("aa")
public class Person{

}

这种形式的将会解析成:

1
<bean id="aa" class="...">

4、会查找spring容器中的bean,看哪些bean中有@Resource注解,并且按照该注解的规则给属性赋值

5、优缺点

这样的写法很简单,但是效率比较低
扫描两次

  • 扫描base-package以及子包所有的类,看哪些类上面加了注解(Component/Service等)
  • 扫描哪些类上加了Rescource/Autowired注解

Spring DI-注解注入

发表于 2017-11-25

Spring DI-注解注入

用注解实现属性注入

1、步骤:

1.1、创建Student类和Person类
1
2
3
4
5
6
7
8
public class Person {
@Resource
private Student student;

public void say(){
this.student.say();
}
}
1.2、把Person和Student放入到spring容器中
1
2
<bean id="student" class="..."></bean>
<bean id="person" class="..."></bean>
1.3、启动依赖注入的注解解析器
1
<context:annotation-config></context:annotation-config>

注意:基本类型不能用注解完成注入

2、原理:

2.1、当启动spring容器的时候创建了person和student两个对象
2.2、加载配置文件是否含有context:annotation-config

当spring容器解析到
context:annotation-config</context:annotation-config>
spring容器会在纳入spring管理范围的bean查找;

2.3、查找这些bean的方法或者属性上是否含有Resource注解
2.4、当存在Resource注解

则查看该注解的属性name的值:

  • 如果name的值为””,则会按照该注解所在的属性的名称和spring容器中的ID做匹配,如果匹配成功,则赋值;
    如果匹配不成功,则按照类型进行匹配,则赋值; 如果类型再匹配不成功,则报错;

  • 如果name的属性值不为””,则按照name的属性的值和spring容器中的ID匹配,成功,则赋值,不成功,则报错

3、xml与注解区别

  • xml效果比较高,写法比较复杂
  • 注解效率比较低,但是写法比较简单

    因为注解可能需要查找spring容器中定义的所有bean。

4、依赖注入的注解

  • @Resource(name=”student”) 见上面
  • @Autowired 按照类型进行匹配
  • @Qualifier(“student”) 按照”student”与spring中的ID进行匹配

@Resource = @Autowired + @Qualifier(“student”)

@Autowired + @Qualifier(“student”)组合使用

spring DI-构造注入

发表于 2017-11-25

spring DI-构造注入

1、需要注意的地方

1
<bean id="student" class="..."></bean>

如果一个bean的配置中没有指名constructor-arg,则用默认的构造器创建对象

2、利用构造器给属性赋值

<bean id="person" class="...">
    <constructor-arg index="0" value="aaa"></constructor-arg>
    <constructor-arg index="1" ref="student"></constructor-arg>
</bean>

一个bean只能配置一个构造器,spring容器会利用该构造器为这个bean创建对象。

一个bean的最标准的写法:

  • 写带参数构造函数时,同时加上默认构造函数
  • 加上对应的setter和getter方法
    好处:在配置文件中可以进行很灵活的配置
1234…14
漠北空城

漠北空城

69 日志
19 标签
链接
  • xyz327
© 2024 漠北空城
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
粤ICP备18054530号-2   |     |