前言Spring 框架作为 Java EE 开发的中流砥柱其核心思想IOC 控制反转、AOP 面向切面编程彻底解决了传统开发中代码耦合、功能复用性差等问题。本文将从 Spring 概述入手逐步拆解 IOC 和 AOP 的实现原理、配置方式结合实战案例让你彻底掌握 Spring 核心一、Spring 概述1.1 Spring 是什么Spring 是轻量级 Java EE 应用开源框架官网http://spring.io/由 Rod Johnson 为解决企业级编程开发的复杂性而创建。它并非替代现有框架而是通过整合各类技术为开发者提供一站式解决方案。1.2 Spring 简化开发的核心体现特性作用IOC控制反转解决传统开发中硬编码导致的程序耦合问题AOP面向切面编程运行期间不修改源代码即可对程序功能增强粘合剂特性提供整合 MyBatis、Struts2 等其他框架的能力1.3 Spring 体系结构Spring 框架按功能划分为五大核心模块Core Container核心容器提供 IOC 和 DI依赖注入核心能力包含 beans、core、context、expression 模块。AOP Aspects面向切面编程实现支持功能增强。Data Access/Integration简化持久层操作整合 JDBC、ORMMyBatis/Hibernate等。Web提供 Spring MVC 框架支持 Servlet、WebSocket 等 Web 开发。Test集成 JUnit、TestNG 等测试框架简化单元测试。1.4 Spring 发展历程1997 年IBM 提出 EJB 思想2002 年Rod Johnson 发布《Expert One-to-One J2EE Design and Development》阐述 EJB 开发痛点2004 年《Expert One-to-One J2EE Development without EJB》发布奠定 Spring 雏形2017 年Spring 5.0 通用版发布至今仍是主流版本。二、Spring IOC控制反转- 核心重点2.1 程序耦合的问题传统开发中Web 层、业务层、持久层存在强耦合例如// 持久层实现类 public class UserDaoImpl implements UserDao { Override public void addUser(){ System.out.println(insert into tb_user......); } } // 业务层实现类 public class UserServiceImpl implements UserService { // 硬编码依赖直接new Dao层对象 private UserDao userDao new UserDaoImpl(); public void addUser(){ userDao.addUser(); } } // 表现层 public class Client { public static void main(String[] args) { UserService userService new UserServiceImpl(); userService.addUser(); } }问题分析若修改 Dao 层实现类Service 层编译失败耦合度极高。2.2 IOC 核心思想控制反转正传开发者主动 new 对象如上述代码控制对象创建权反转由 IOC 工厂统一创建、管理对象开发者被动获取实现解耦。2.2.1 工厂模式实现 IOC 解耦手动实现步骤 1编写配置文件bean.propertiesUserDaocom.hg.dao.UserDaoImpl UserServicecom.hg.service.UserServiceImpl步骤 2实现 IOC 工厂类public class BeanFactory { // 容器存储对象 private static MapString, Object beans new HashMap(); // 静态代码块加载配置文件并创建对象 static { try { InputStream is BeanFactory.class.getClassLoader().getResourceAsStream(bean.properties); Properties prop new Properties(); prop.load(is); // 遍历配置文件反射创建对象 SetObject keys prop.keySet(); for (Object key : keys) { String beanName (String) key; String className prop.getProperty(beanName); Object bean Class.forName(className).newInstance(); beans.put(beanName, bean); } } catch (Exception e) { throw new ExceptionInInitializerError(初始化Bean工厂失败); } } // 获取对象方法 public static Object getBean(String beanName) { return beans.get(beanName); } }步骤 3改造 Service 层public class UserServiceImpl implements UserService { // 从工厂获取对象而非手动new private UserDao userDao (UserDao) BeanFactory.getBean(UserDao); public void addUser(){ userDao.addUser(); } }2.3 Spring 官方 IOC 实现2.3.1 快速上手XML 配置步骤 1创建 Maven 工程引入依赖dependencies !-- Spring核心依赖 -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version5.2.8.RELEASE/version /dependency /dependencies步骤 2编写 Spring 配置文件applicationContext.xml?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd !-- 将对象交给Spring容器管理 -- bean iduserDao classcom.hg.dao.UserDaoImpl/bean bean iduserService classcom.hg.service.UserServiceImpl/bean /beans步骤 3测试获取容器对象public class Client { public static void main(String[] args) { // 加载配置文件创建Spring容器 ApplicationContext ac new ClassPathXmlApplicationContext(applicationContext.xml); // 从容器获取对象 UserDao userDao (UserDao) ac.getBean(userDao); UserService userService (UserService) ac.getBean(userService); userService.addUser(); } }2.3.2 DI依赖注入- 解决 Service 层耦合IOC 解决对象创建问题DI 解决对象依赖赋值问题核心有 4 种注入方式方式 1构造函数注入// Service层 public class UserServiceImpl implements UserService { private UserDao userDao; private String name; private Integer age; // 构造方法 public UserServiceImpl(UserDao userDao, String name, Integer age) { this.userDao userDao; this.name name; this.age age; } Override public void addUser(){ System.out.println(name , age); userDao.addUser(); } }!-- 配置文件 -- bean iduserDao classcom.hg.dao.UserDaoImpl/bean bean iduserService classcom.hg.service.UserServiceImpl constructor-arg nameuserDao refuserDao/constructor-arg constructor-arg namename value张三/constructor-arg constructor-arg nameage value18/constructor-arg /bean方式 2Set 方法注入最常用// Service层 public class UserServiceImpl implements UserService { private UserDao userDao; private String name; private Integer age; // Set方法 public void setUserDao(UserDao userDao) {this.userDao userDao;} public void setName(String name) {this.name name;} public void setAge(Integer age) {this.age age;} Override public void addUser(){ System.out.println(name , age); userDao.addUser(); } }!-- 配置文件 -- bean iduserDao classcom.hg.dao.UserDaoImpl/bean bean iduserService classcom.hg.service.UserServiceImpl property nameuserDao refuserDao/property property namename value张三/property property nameage value18/property /bean方式 3自动注入!-- byType按类型注入byName按bean的id注入 -- bean iduserDao classcom.hg.dao.UserDaoImpl/bean bean iduserService classcom.hg.service.UserServiceImpl autowirebyType/bean方式 4集合类型注入了解// Service层 public class UserServiceImpl implements UserService { private String[] myStrs; private ListString myList; private SetString mySet; private MapString,String myMap; // Set方法省略... Override public void addUser(){ System.out.println(Arrays.toString(myStrs)); System.out.println(myList); System.out.println(mySet); System.out.println(myMap); } }!-- 配置文件 -- bean iduserService classcom.hg.service.UserServiceImpl property namemyStrs array valueAAA/value valueBBB/value /array /property property namemyList list valueAAA/value valueBBB/value /list /property property namemySet set valueAAA/value valueBBB/value /set /property property namemyMap map entry keykey1 valuevalue1/entry entry keykey2 valuevalue2/entry /map /property /bean未完待续~~~