例子中仅包含两种类:英雄类Hero和武器类Weapon。

  1. 演示DI:给Hero初始化Weapon
  2. 演示AOP:法师是一个英雄,当他发动攻击的时候需要念咒语,只有咒语正确才能施展魔法。通过定义一个切面来检验咒语的正确性(假设咒语必须要符合某种公共的标准。。。。。)

代码结构:

Spring容器的最小可用依赖

  1. Spring的核心是一个IOC容器,包含两个基础模块:context以及bean(必要)
  2. 添加AspectJ相关依赖用于支持AOP(必要
  3. 添加Log4j依赖方便输出(可选)
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6.  
  7. <groupId>sample</groupId>
  8. <artifactId>spring</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10.  
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <!-- -source 1.5 中不支持 try-with-resources-->
  14. <maven.compiler.source>1.8</maven.compiler.source>
  15. <maven.compiler.target>1.8</maven.compiler.target>
  16. <!-- Use the latest version whenever possible. -->
  17. <spring.version>5.1.3.RELEASE</spring.version>
  18. <log4j.version>2.11.1</log4j.version>
  19. <aspectj.version>1.9.2</aspectj.version>
  20. </properties>
  21.  
  22. <dependencies>
  23. <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
  24. <dependency>
  25. <groupId>org.springframework</groupId>
  26. <artifactId>spring-context</artifactId>
  27. <version>${spring.version}</version>
  28. </dependency>
  29. <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
  30. <dependency>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring-beans</artifactId>
  33. <version>${spring.version}</version>
  34. </dependency>
  35. <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
  36. <dependency>
  37. <groupId>org.apache.logging.log4j</groupId>
  38. <artifactId>log4j-core</artifactId>
  39. <version>${log4j.version}</version>
  40. </dependency>
  41. <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
  42. <dependency>
  43. <groupId>org.apache.logging.log4j</groupId>
  44. <artifactId>log4j-api</artifactId>
  45. <version>${log4j.version}</version>
  46. </dependency>
  47. <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
  48. <dependency>
  49. <groupId>org.aspectj</groupId>
  50. <artifactId>aspectjrt</artifactId>
  51. <version>${aspectj.version}</version>
  52. </dependency>
  53. <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
  54. <dependency>
  55. <groupId>org.aspectj</groupId>
  56. <artifactId>aspectjweaver</artifactId>
  57. <version>${aspectj.version}</version>
  58. </dependency>
  59. </dependencies>
  60. </project>

用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. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <import resource="bean/weapons.xml"/>
  7. <import resource="bean/heroes.xml"/>
  8. </beans>

★子配置文件1:

  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. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
  6.  
  7. <bean id="mySword" class="sample.spring.iocbasis.weapon.Sword"/>
  8. <bean id="myMagicBook" class="sample.spring.iocbasis.weapon.MagicBook"/>
  9.  
  10. <aop:config>
  11. <aop:aspect ref="myMagicBook">
  12. <aop:pointcut id="mageAttack"
  13. expression="execution(* sample.spring.iocbasis.hero.Mage.attack(String))" />
  14. <aop:around pointcut-ref="mageAttack" method="magicLimit" />
  15. </aop:aspect>
  16. </aop:config>
  17. </beans>

★子配置文件2,IDEA可能会报错说找不到引用,但其实是Ok的。注意不要重复import一个配置文件,这会导致重复定义bean或者切面:

  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. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6.  
  7. <bean id="iocWarrior" class="sample.spring.iocbasis.hero.Warrior">
  8. <constructor-arg ref="mySword" />
  9. </bean>
  10.  
  11. <bean id="iocMage" class="sample.spring.iocbasis.hero.Mage">
  12. <constructor-arg ref="myMagicBook" />
  13. </bean>
  14. </beans>

实例化容器&使用容器

★程序入口:

  1. package sample.spring.iocbasis;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. import sample.spring.iocbasis.hero.Hero;
  6. import sample.spring.iocbasis.hero.Mage;
  7. import sample.spring.iocbasis.hero.Warrior;
  8. import sample.spring.iocbasis.weapon.MagicBook;
  9. import sample.spring.iocbasis.weapon.Sword;
  10.  
  11. public class MyTest {
  12. public static void main(String[] args) {
  13. System.out.println("===========手动调用setter方法注入=================");
  14. Warrior warrior = new Warrior();
  15. warrior.attack(null);
  16. warrior.setWeapon(new Sword());
  17. warrior.attack(null);
  18.  
  19. System.out.println("===========手动调用构造器方法注入=================");
  20. Warrior warrior2 = new Warrior(new Sword());
  21. warrior2.attack(null);
  22.  
  23. System.out.println("===========直接从IOC容器中获得事先组装好的对象=================");
  24. ApplicationContext context = new ClassPathXmlApplicationContext("\\spring\\config.xml");
  25. Warrior iocWarrior = context.getBean("iocWarrior", Warrior.class);
  26. iocWarrior.attack(null);
  27.  
  28. System.out.println("===========通过动态代理增强方法=================");
  29. Hero iocMage = context.getBean("iocMage", Hero.class);
  30. iocMage.attack("hello world.");
  31. iocMage.attack("hlo worl.");
  32.  
  33. System.out.println("===========绕过动态代理=================");
  34. new Mage(new MagicBook()).attack("hlo worl.");
  35. }
  36. }
  37. /*
  38. ===========手动调用setter方法注入=================
  39. Warrior{no=1}用WoodenStick{}发起了一次攻击。
  40. Warrior{no=1}用Sword{no=1}发起了一次攻击。
  41. ===========手动调用构造器方法注入=================
  42. Warrior{no=2}用Sword{no=2}发起了一次攻击。
  43. ===========直接从IOC容器中获得事先组装好的对象=================
  44. Warrior{no=3}用Sword{no=3}发起了一次攻击。
  45. ===========通过动态代理增强方法=================
  46. Mage{no=1}试图发动一次魔法攻击,准备校验咒语【hello world.】正确性 ...
  47. Mage{no=1}用MagicBook{no=1}发起了一次攻击
  48. Mage{no=1}试图发动一次魔法攻击,准备校验咒语【hlo worl.】正确性 ...
  49. Mage{no=1}的咒语念错了,魔法发动失败 ...
  50. ===========绕过动态代理=================
  51. Mage{no=2}用MagicBook{no=2}发起了一次攻击
  52. */

唯一能看出“第三方依赖痕迹”的类:

  1. package sample.spring.iocbasis.weapon;
  2.  
  3. import org.apache.logging.log4j.LogManager;
  4. import org.apache.logging.log4j.Logger;
  5. import org.aspectj.lang.ProceedingJoinPoint;
  6.  
  7. public class MagicBook implements Weapon {
  8.  
  9. private static final Logger LOGGER = LogManager.getLogger();
  10.  
  11. private static int count = 0;
  12.  
  13. private int no = ++count;
  14.  
  15. @Override
  16. public void attack() {
  17.  
  18. }
  19.  
  20. public void magicLimit(ProceedingJoinPoint jp) {
  21. try {
  22. Object obj = jp.getThis();
  23. String spell = String.valueOf(jp.getArgs()[0]);
  24. LOGGER.info("{}试图发动一次魔法攻击,准备校验咒语【{}】正确性 ...", obj, spell);
  25. if ("hello world.".equals(spell)) {
  26. jp.proceed();
  27. } else {
  28. LOGGER.info("{}的咒语念错了,魔法发动失败 ...", obj);
  29. }
  30. } catch (Throwable throwable) {
  31. throwable.printStackTrace();
  32. }
  33. }
  34.  
  35. @Override
  36. public String toString() {
  37. return "MagicBook{" +
  38. "no=" + no +
  39. '}';
  40. }
  41. }

其它类:

  1. package sample.spring.iocbasis.hero;
  2.  
  3. import org.apache.logging.log4j.LogManager;
  4. import org.apache.logging.log4j.Logger;
  5. import sample.spring.iocbasis.weapon.Weapon;
  6. import sample.spring.iocbasis.weapon.WoodenStick;
  7.  
  8. public class Warrior implements Hero {
  9.  
  10. private static final Logger LOGGER = LogManager.getLogger();
  11.  
  12. private static int count = 0;
  13.  
  14. private int no = ++count;
  15.  
  16. private Weapon weapon;
  17.  
  18. public Warrior() {
  19. weapon = new WoodenStick();
  20. }
  21.  
  22. public Warrior(Weapon weapon) {
  23. this.weapon = weapon;
  24. }
  25.  
  26. public void setWeapon(Weapon weapon) {
  27. this.weapon = weapon;
  28. }
  29.  
  30. @Override
  31. public void attack(String sth) {
  32. LOGGER.info("{}用{}发起了一次攻击。", this, weapon);
  33. weapon.attack();
  34. }
  35.  
  36. @Override
  37. public String toString() {
  38. return "Warrior{" +
  39. "no=" + no +
  40. '}';
  41. }
  42. }

Warrior.java

  1. package sample.spring.iocbasis.hero;
  2.  
  3. import org.apache.logging.log4j.LogManager;
  4. import org.apache.logging.log4j.Logger;
  5. import sample.spring.iocbasis.weapon.Weapon;
  6.  
  7. public class Mage implements Hero {
  8.  
  9. private static final Logger LOGGER = LogManager.getLogger();
  10.  
  11. private static int count = 0;
  12.  
  13. private int no = ++count;
  14.  
  15. private Weapon weapon;
  16.  
  17. public Mage(Weapon weapon) {
  18. this.weapon = weapon;
  19. }
  20.  
  21. @Override
  22. public void attack(String spell) {
  23. LOGGER.info("{}用{}发起了一次攻击", this, weapon);
  24. }
  25.  
  26. @Override
  27. public String toString() {
  28. return "Mage{" +
  29. "no=" + no +
  30. '}';
  31. }
  32. }

Mage.java

  1. package sample.spring.iocbasis.weapon;
  2.  
  3. public class Sword implements Weapon {
  4.  
  5. private static int count = 0;
  6.  
  7. private int no = ++count;
  8.  
  9. @Override
  10. public void attack() {
  11. }
  12.  
  13. @Override
  14. public String toString() {
  15. return "Sword{" +
  16. "no=" + no +
  17. '}';
  18. }
  19. }

Sword.java

  1. package sample.spring.iocbasis.weapon;
  2.  
  3. public class WoodenStick implements Weapon {
  4. @Override
  5. public void attack() {
  6. }
  7.  
  8. @Override
  9. public String toString() {
  10. return "WoodenStick{}";
  11. }
  12. }

WoodenStick.java

  1. package sample.spring.iocbasis.hero;
  2.  
  3. public interface Hero {
  4.  
  5. void attack(String sth);
  6. }

Hero.java

Spring笔记 #01# 一个小而生动的IOC例子代码的更多相关文章

  1. Spring笔记01(基础知识)

    1.基础知识 01.Spring:轻量级Java EE开源框架,它是由Rod Johnson为了解决企业应用程序开发的复杂性而创建. 02.目标:实现一个全方位的整合框架,实现“一站式”的企业应用开发 ...

  2. c++学习笔记---03---从一个小程序说起2

    从一个小程序说起2 要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置.当用户按下键盘上的"Enter"键时,数据输入 ...

  3. c++学习笔记---02---从一个小程序说起

    从一个小程序说起 这一讲的主要目的是帮助大家在C语言的背景知识上与C++建立联系. 问题探索 问题:对一个整型数组求和. 要求:定义一个存储着 n 个元素的数组,要求用C语言完成这个任务. 赶紧的:大 ...

  4. Vue2.x源码学习笔记-从一个小例子查看vm实例生命周期

    学习任何一门框架,都不可能一股脑儿的从入口代码从上到下,把代码看完, 这样其实是很枯燥的,我想也很少有人这么干,或者这么干着干着可能干不下去了. 因为肯定很无聊. 我们先从一个最最简单的小例子,来查看 ...

  5. python笔记3----第一个小爬虫

    1.先看看要爬的网站有没有爬虫协议,可以看该网站有没有robots.txt,如豆瓣的: 2.requests模块:[requests是第三方,代码比python自带的urllib模块简单] 先加载re ...

  6. Spring笔记01

    spring 第一章 Spring模块规划图 核心架包 spring-beans-4.0.0.RELEASE. spring-core-4.0.0.RELEASE. spring-context-4. ...

  7. spring boot的一个小项目小型进销存系统

    项目所需的依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  8. 关于封装的一个小问题和TA的例子

    写个小例子吧 --  很多细节(如校验.判断等等)都略了 其实不是有意写成这样,而是很多朋友都这么写(当然里面也有点夸张的写法) 这么写其实也没什么不好,简单明了,不用动脑子,一看就很直白, 但是如果 ...

  9. Oracle学习笔记:一个简单的行转列例子

    一个简单的行列转换例子,原始数据. create table temp_cwh_student ( name ), subject ), score ) ) select * from temp_cw ...

随机推荐

  1. Inside The C++ Object Model(二)

    ============================================================================2-0. 关键字explicit被引入C++,提 ...

  2. Android Adb命令查看包名信息

    Android O 8.1.0 data/system/packages.listdata/system/packages.xmldata/system/package-usage.listdata/ ...

  3. vue重要项目的参考

    https://github.com/PanJiaChen/vue-element-admin vue项目参考  重点 https://github.com/opendigg/awesome-gith ...

  4. 3.nodejs(三) 常用API

    1.querystring querystring: --- > qs npm i qs ==> qs:parse/stringify第三方插件,只有一个参数 JSON.parse  字符 ...

  5. yarn-RM-check-by-curl

    #!bin/bash SELF_DIR="$( cd "$( dirname "$0" )" && pwd )" #grep ...

  6. HTML01

    1.什么是HTML?(Hyper Text Markup Language:超文本标记语言) 超文本:功能比普通文本更加强大 标记语言:使用一组标签对内容进行描述的一门语言(它不是编程语言) 2.为什 ...

  7. Python网络编程-Socket简单通信(及python实现远程文件发送)

    学习python中使用python进行网络编程,编写简单的客户端和服务器端进行通信,大部分内容来源于网络教程,这里进行总结供以后查阅. 先介绍下TCP的三次握手: 1,简单的发送消息: 服务器端: i ...

  8. LeetCode 237 Delete Node in a Linked List 解题报告

    题目要求 Write a function to delete a node (except the tail) in a singly linked list, given only access ...

  9. python基础(15)-socket网络编程&socketserver

    socket 参数及方法说明 初始化参数 sk = socket.socket(参数1,参数2,参数3) 参数1:地址簇 socket.AF_INET IPv4(默认) socket.AF_INET6 ...

  10. IIS相关

    使用aspnet_regiis.exe重新注册.NET Framework 重新安装IIS以后,需要用aspnet_regiis.exe来注册.NET Framework, 如下: C:\WINDOW ...