背景

  • JavaEE 应用框架
  • 基于IOC和AOP的结构J2EE系统的框架
  • IOC(反转控制):即创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象,是Spring的基础
  • DI(依赖注入):拿到的对象的属性,已经被注入好相关值了,直接使用即可
  • AOP(Aspect Oriented Program 面向切面编程)
    • 功能分为核心业务功能(登录、增删改查)和周边功能(性能统计、日志、事务管理)
    • 周边功能在Spring的面向切面编程AOP思想里,即被定义为切面
    • 面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发
    • 然后把切面功能和核心业务功能 "编织" 在一起

IOC/DI

  • 新建项目
  • 添加依赖jar包
  • 准备 pojo
  • 配置 applicationContext.xml

Catagory.java

 1 package com.how2java.pojo;
2
3 import org.springframework.stereotype.Component;
4
5 @Component("c")
6 public class Category {
7
8 public int getId() {
9 return id;
10 }
11 public void setId(int id) {
12 this.id = id;
13 }
14 public String getName() {
15 return name;
16 }
17 public void setName(String name) {
18 this.name = name;
19 }
20 private int id;
21 private String name = "catagory 1";
22 }

Product.java

 1 package com.how2java.pojo;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.stereotype.Component;
5
6 @Component("p")
7 public class Product {
8 private int id;
9 private String name = "product 1";
10
11 @Autowired
12 private Category category;
13 public int getId() {
14 return id;
15 }
16 public void setId(int id) {
17 this.id = id;
18 }
19 public String getName() {
20 return name;
21 }
22 public void setName(String name) {
23 this.name = name;
24 }
25 public Category getCategory() {
26 return category;
27 }
28 public void setCategory(Category category) {
29 this.category = category;
30 }
31 }

TestSpring.java

 1 package com.how2java.test;
2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 import com.how2java.pojo.Product;
7
8 public class TestSpring {
9
10 public static void main(String[] args) {
11 ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
12
13 Product p = (Product) context.getBean("p");
14 System.out.println(p.getName());
15 System.out.println(p.getCategory().getName());
16 }
17 }

applicationContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
4 xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="
6 http://www.springframework.org/schema/beans
7 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
8 http://www.springframework.org/schema/aop
9 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
10 http://www.springframework.org/schema/tx
11 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
12 http://www.springframework.org/schema/context
13 http://www.springframework.org/schema/context/spring-context-3.0.xsd">
14
15 <context:annotation-config/>
16 <bean name="c" class="com.how2java.pojo.Category">
17 <property name="name" value="category 1" />
18 </bean>
19 <bean name="p" class="com.how2java.pojo.Product">
20 <property name="name" value="product1" />
21 <!-- <property name="category" ref="c" /> -->
22 </bean>
23
24 </beans>

AOP

  • 辅助功能和核心业务功能彼此独立开发
  • “登录”功能没有“性能统计”和“日志输出”也可以正常运行
  • 如果有需要就把“日志输出”和“登录”功能编制在一起,实现登录时看到日志输出
  • 辅助功能叫做切面,这种选择性的,低耦合的把切面和核心业务功能结合在一起的编程思想,就叫AOP

ProductService.java

1 package com.how2java.service;
2
3 public class ProductService {
4 public void doSomeService() {
5 System.out.println("doSomeService");
6 }
7 }

LoggerAspect.java

 1 package com.how2java.aspect;
2
3 import org.aopalliance.intercept.Joinpoint;
4 import org.aspectj.lang.ProceedingJoinPoint;
5
6 public class LoggerAspect {
7 public Object log(ProceedingJoinPoint joinPoint) throws Throwable{
8 System.out.println("start log:" + joinPoint.getSignature().getName());
9 Object object = joinPoint.proceed();
10 System.out.println("end log:" + joinPoint.getSignature().getName());
11 return object;
12 }
13 }

TestSpring.java

 1 package com.how2java.test;
2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 import com.how2java.service.ProductService;
7
8 public class TestSpring {
9 public static void main(String[] args) {
10 ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
11 ProductService s = (ProductService) context.getBean("s");
12 s.doSomeService();
13 }
14 }

applicationContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:aop="http://www.springframework.org/schema/aop"
5 xmlns:tx="http://www.springframework.org/schema/tx"
6 xmlns:context="http://www.springframework.org/schema/context"
7 xsi:schemaLocation="
8 http://www.springframework.org/schema/beans
9 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
10 http://www.springframework.org/schema/aop
11 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
12 http://www.springframework.org/schema/tx
13 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
14 http://www.springframework.org/schema/context
15 http://www.springframework.org/schema/context/spring-context-3.0.xsd">
16
17 <bean name="s" class="com.how2java.service.ProductService">
18 </bean>
19
20 <bean id="loggerAspect" class="com.how2java.aspect.LoggerAspect"/>
21
22 <aop:config>
23 <aop:pointcut id="loggerCutpoint"
24 expression=
25 "execution(* com.how2java.service.ProductService.*(..))"/>
26
27 <aop:aspect id="logAspect" ref="loggerAspect">
28 <aop:around pointcut-ref="loggerCutpoint" method="log"/>
29 </aop:aspect>
30 </aop:config>
31
32 </beans>

  • 通过xml文件配置的方式,把日志记录功能(切面)和核心业务编织在了一起,而TestSpring代码没有发生任何变化(解耦)

参考

Spring DI原理

https://www.cnblogs.com/gudazhi/p/11088439.html

Spring的IOC原理

https://www.cnblogs.com/superjt/p/4311577.html

步骤

https://www.cnblogs.com/vanl/p/5607534.html

[Java] Spring 使用的更多相关文章

  1. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  2. 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)

    你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...

  3. 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)

    硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...

  4. 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)

    从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...

  5. 从零开始学 Java - Spring 支持 CORS 请求踩的坑

    谁没掉进过几个大坑 记得好久之前,总能时不时在某个地方看到一些标语,往往都是上面一个伟人的头像,然后不管是不是他说的话,下面总是有看起来很政治正确且没卵用的屁话,我活到目前为止,最令我笑的肚子痛得是下 ...

  6. 从零开始学 Java - Spring MVC 实现跨域资源 CORS 请求

    论职业的重要性 问:为什么所有家长都希望自己的孩子成为公务员? 答:体面.有权.有钱又悠闲. 问:为什么所有家长都希望自己的孩子成为律师或医生? 答:体面.有钱.有技能. 问:为什么所有家长都不怎么知 ...

  7. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

  8. 从零开始学 Java - Spring AOP 实现主从读写分离

    深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...

  9. 支持Java Spring MVC

    Java Spring MVC能很方便在后台返回JSON数据,所以与MiniUI进行数据交互非常简单. 1)后台处理: 在MVC控制器中,可以通过方法参数接收数据,也可以通过Request接收更复杂的 ...

  10. Java Spring AOP用法

    Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...

随机推荐

  1. vue 快速入门 系列 —— 初步认识 vue

    其他章节请看: vue 快速入门 系列 初步认识 vue vue 是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. 所谓渐进式,就是你可以一步一步.有阶段 ...

  2. 全网最详细的Linux命令系列-mkdir命令

    Linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 命令格式: mkdir [选项] 目录... 命令功能: ...

  3. Dynamics CRM各个版本的元数据浏览解决方案

    https://docs.microsoft.com/en-us/dynamics365/customerengagement/on-premises/developer/browse-your-me ...

  4. 6. Mybatis resultMap

    resultMap 元素是MyBatis中最重要最强大的元素.它就是让你远离90%的需要从结果集中取出数据的JDBC代码的那东西,而且在一些情形下允许你做一些JDBC不支持的事情.事实上,编写相似于对 ...

  5. Data Mining UVA - 1591

      Dr. Tuple is working on the new data-mining application for Advanced Commercial Merchandise Inc. O ...

  6. Day07_37_深度剖析集合中的contains()方法

    深度剖析集合中的 contains()方法 contains()方法查找集合中是否包含某个元素 contains() 底层使用的是 equals()方法 当contains()方法拿到一个对象的时候, ...

  7. C#入门到精通系列课程——第2章编写C#程序

    ◆本章内容 (1)熟悉Visual Studio 2017开发环境 (2)编写第一个C#程序 (3)C#程序结构预览 (4)程序编写规范 (5)难点解答 ◆本章简述 要学习C#编程,必然要熟悉C#程序 ...

  8. 【MQ中间件】RabbitMQ -- RabbitMQ死信队列及内存监控(4)

    1.RabbitMQ TTL及死信队列 1.1.TTL概述 过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取:过了之后消息将自动被删除.RabbitMQ可以对消息和队列设 ...

  9. POJ1422 最小路径覆盖

    题意:      一个战场,往战场上投放伞兵,每个伞兵不能后退,只能往前走,问你最少多少个伞兵可以吧所有的点都占领. 思路:      这个题是最小路径覆盖,最小路径覆盖 = n - 最大匹配数,首先 ...

  10. 路由器逆向分析------QEMU的基本使用方法(MIPS)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/69258334 一.QEMU的运行模式 直接摘抄自己<揭秘家用路由器0day漏 ...