感觉自己的spring理解的不好.所以重新开始学习.

这篇文章主要是来理解DI(依赖注入),Aop(切面)

一.DI(依赖注入,这里没有涉及到注释.只是用xml文件和Bean的方法来注册pojo,)

依赖注入就是将创建bean对象的权利交给spring框架(控制反转) 然后用Applicationcontext.getBean()  来获取对象.

容器:spring容器创建对象,管理对象,并负责管理对象的生命周期.  容器有两种 BeanFactiory   ..ApplicationContext ..多的就不解释了,BeanFactiory 比较low,这里使用ApplicaitonContext

ApplicaitonContext:

1  FileSystemXmlApplicationContext:以基于文件系统的XML配置文件创建ApplicationContext实例。

2  ClassPathXmlApplicationContext:以类加载路径下的XML配置文件创建的ApplicationContext实例

3    XmlWebApplicationContext:从web应用下的一个或者多个xml配置文件加载创建ApplicationContext实例

4   AnnotationConfigApplicationContext 从一个或者多个基于java的配置类中加载Spring ApplicaitonContext实例

5    AnnotationConfigWebApplicationContext 基于一个或者多个java的配置类来创建spring web 的应用上下文

二. Aop :面向切面编程.(将复用性很强的模块抽离出来,然后通过配置,将抽离出来的模块(比如日志模块),覆盖到其他需要日志模块的服务上)

一个项目假设有讲师服务,学生服务,计费服务.......还有日志模块,安全模块,事务模块

讲师服务,学生服务,计费服务 每一个服务都需要与日志模块,安全模块,事务模块 进行耦合.....如果这个样子,,每一个服务里面的代码不能够专注于解决本服务的问题.需要调用日志模块,安全模块,事务模块的代码.

这样,代码的复用性会很低,耦合性很高.

创建一个Person类...里面有一个doSomething方法

package com.start.demo;
/**
* 男孩,女孩,工程师,程序员....
*/
public class Person {
private String name;
private int age;
private Play play; public Person(Play p) {
this.play = p;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} void doSomething() {
System.out.println(" we can play " + play.getType() +"together");
}
}

创建一个Play类  type 表示可以做的事情

package com.start.demo;

/**
* 各种活动,,玩游戏,读书,看电视.....
*/
public class Play {
private String type="computer game"; public String getType() {
return type;
} public void setType(String type) {
this.type = type;
}
}

测试Aop的一个类

package com.start.demo;

/**
* 这个类是用来测试Aop.在切点之前,之后,分别调用对应的方法
*/
public class Asker {
private String name;
void doSomethingBefore(){
System.out.println("what can we do ");
}
void doSomethingAfter(){
System.out.println("that's fine");
}
}

装配bean的xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--装配bean-->
<bean id="person" class="com.start.demo.Person">
<constructor-arg ref="play"/>
</bean>
<bean id="play" class="com.start.demo.Play"/>
<bean id="asker" class="com.start.demo.Asker"/>
<aop:config>
<aop:aspect ref="asker">
<!-- pointcut 的id 不能与 配置切点bean的id一样了,会报错.-->
<aop:pointcut id="personPointcut"
expression="execution(* *.doSomething())"/><!--execution(* * .doSomething(..)) 要是有参数,需要在方法体里面加 ..-->
<aop:before pointcut-ref="personPointcut" method="doSomethingBefore"/>
<aop:after pointcut-ref="personPointcut" method="doSomethingAfter"/>
</aop:aspect>
</aop:config> </beans>

用javaBean来装配对象

package com.start.confBean;

import com.start.demo.Person;
import com.start.demo.Play;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class PersonConf {
@Bean
public Person person() {
return new Person(play());
} @Bean
public Play play() {
return new Play();
}
}

测试Main类

package com.start.demo;

import com.start.confBean.PersonConf;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext appcontext = new ClassPathXmlApplicationContext("beans.xml"); //从beans.xml 文件获取ApplicaitonContext
// AnnotationConfigApplicationContext annotationApplicationContext = new AnnotationConfigApplicationContext(PersonConf.class);//PersonConf.java 文件获取ApplicaitonContext
// Person person1 = annotationApplicationContext.getBean(Person.class); //获取bean ,直接指定Bean 为Person
// Person person = (Person) appcontext.getBean("person");//获取bean person 为配置文件里面的 id
Person pers = (Person) appcontext.getBean("person");
pers.doSomething();
}
}

这些代码虽然很简单,却让我认识清楚了DI和Aop的作用

Spring(DI,AOP) 理解(一)的更多相关文章

  1. spring ioc aop 理解

    OC,依赖倒置的意思,所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果 ...

  2. Spring的Aop理解

    主要作用:解决代码复用,避免重复性编写代码. 比较典型的场景:日志打印,权限验证,事务处理 参考网址为:http://moon-walker.iteye.com/blog/2381532 spring ...

  3. 9.秋招复习简单整理之Spring面试AOP和IOC的理解

    1.Spring的AOP理解: OOP面向对象,允许开发者定义纵向的关系,但不适用于定义横向的关系,导致了大量代码的重复,而不利于各个模块的重用. AOP,一般称为面向切面,作为面向对象的一种补充,用 ...

  4. 对于Spring中AOP,DI,IoC概念的理解

    IOC IoC(inversion of Control),控制反转.就好像敏捷开发和SCRUM一样,不是什么技术,而是一种方法论,一种工程化的思想.使用IoC的思想意味着你将设计好的对象交给容器控制 ...

  5. Spring理解IOC,DI,AOP作用,概念,理解。

    IOC控制反转:创建实例对象的控制权从代码转换到Spring容器.实际就是在xml中配置.配置对象 实例化对象时,进行强转为自定义类型.默认返回类型是Object强类型. ApplicationCon ...

  6. 黑马-Spring(IOC&DI) AOP

    IOC(控制翻转) 概念 把对象的创建.初始化.销毁等工作交给spring容器来做 案例 环境 步骤 1.  写一个HelloWorld类 2.  写一个配置文件   把hello类放到spring容 ...

  7. spring+IOC+DI+AOP优点分析(一)

    Spring是什么: Spring是一个轻量级的DI和AOP容器框架. 说它轻量级有一大部分原因是相对与EJB的(虽然本人从没有接触过EJB的应用),重要的是,Spring是非侵入式的,基于sprin ...

  8. Spring系列(二):Spring IoC/DI的理解

    这几天重新学习了一下Spring,在网上找了相关的ppt来看,当看到Spring IoC这一章节的时候,先大致浏览了一下内容,有将近50页的内容,内心窃喜~QAQ~,看完这些内容能够对IoC有更深层次 ...

  9. Spring的AOP简单理解

    最近在研究spring的AOP,翻译出来的意思是面向切面. 总结如下: 所谓AOP就是将分散在各个方法处的公共代码提取到一处, 并通过类似拦截器的机制实现代码的动态整合.可以简单地想象成, 在某个方法 ...

随机推荐

  1. BNP Paribas Cardif Claims Management

    2月20日: 查看任务介绍,二分类问题,评价标准logloss 下载数据 2月21~27日: 查看数据组成,标识分类变量.离散变量.连续变量. 发现连续数据有大量非随机空缺(占总量一半),主要集中在v ...

  2. Elasticsearch系列---多字段搜索

    概要 本篇介绍一下multi_match的best_fields.most_fields和cross_fields三种语法的场景和简单示例. 最佳字段 bool查询采取"more-match ...

  3. [剑指offer]14-1.剪绳子

    14-1.剪绳子 方法一 动态规划 思路:递归式为f(n)=max(f(i), f(n-i)),i=1,2,...,n-1 虽然我现在也没有彻底明白这个递归式是怎么来的,但用的时候还是要注意一下.f( ...

  4. mybatis3.2.7 原理和入门程序

    使用jdbc操作数据库有以下缺点   |--数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁开启和关闭,造成数据源资源浪费,影响数据库性能.    设想:使用数据库连接池管理数据库连接.   ...

  5. 图-连通分量-DFS-并查集-695. 岛屿的最大面积

    2020-03-15 16:41:45 问题描述: 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二 ...

  6. HDU 1847-Good Luck in CET-4 Everybody!-博弈SG函数模板

    Problem Description 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此.当然,作为在考场浸润了十几载 ...

  7. C# 获取基类或者接口的所有继承类方法

    static class ReflectionHelper { public static IEnumerable<T> CreateAllInstancesOf<T>() { ...

  8. Java基础语法(7)-数组

    title: Java基础语法(7)-数组 blog: CSDN data: Java学习路线及视频 1.数组的概述 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并 ...

  9. JSON字符串带BOM头"ufeff"

    调用三方接口返回值JSON字符串带BOM头"\ufeff",JSON解析死活报错. 我是用SpringBoot的RestTemplate调用三方接口的,一开始返回值我是用对象接收返 ...

  10. Python第五章-内置数据结构03-元组

    Python 内置的数据结构 三.元组(tuple) python 作为一个发展中的语言,也提供了其他的一些数据类型. tuple也是 python 中一个标准的序列类型. 他的一些操作和str和li ...