1.简介:
Spring简介
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
2.为什么学习Spring:
学习Spring框架有以下几个原因:
- 强大的功能:Spring框架是Java开发中最流行的企业级框架之一,它提供了很多强大的功能和特性,比如依赖注入(DI)、面向切面编程(AOP)、事务管理、RESTful Web服务等。通过学习Spring,你可以更高效地开发Java应用,提高开发效率和质量。
- 应用广泛:Spring框架在各种规模的企业应用中广泛应用,尤其在Java后端开发中。许多企业都将Spring作为其首选框架,因此学习Spring可以增加你的就业机会和市场竞争力。
- 解耦和模块化:Spring框架采用了松散耦合的设计理念,可以将应用程序的不同模块解耦,使得应用更加灵活和可维护。通过学习Spring,你可以学会如何设计和开发具有高内聚、低耦合的模块化应用。
- 社区支持:Spring框架有一个庞大的用户社区,你可以在社区中得到丰富的资源、教程和解决方案。如果遇到问题或困惑,可以向社区寻求帮助和指导。
- 整合其他框架:Spring框架提供了很多整合其他框架的功能,比如与Hibernate、MyBatis等ORM框架的无缝整合,与Spring MVC、Spring Boot等web框架的集成等。学习Spring可以帮助你更好地理解和利用这些框架。
所以学习Spring框架可以提升你的Java开发技能和就业前景,让你成为一名高效、专业的企业级Java开发者。
3.Spring的核心特性:
Spring框架的核心特性包括:
- 控制反转(IoC):Spring通过IoC容器管理对象的依赖关系,将对象的创建、组装和管理交给Spring容器,降低了组件之间的耦合度。
- 面向切面编程(AOP):Spring支持AOP,通过动态代理的方式,将横切关注点(如日志、事务等)从业务逻辑中解耦出来,提供了更好的模块化和复用性。
- 基于注解的配置:Spring提供了丰富的注解,用于配置和管理Bean、依赖注入、事务等,简化了配置文件的编写。
- 数据访问与集成:Spring提供了对各种持久化技术的支持,如JDBC、ORM框架(如Hibernate、MyBatis)、NoSQL数据库等,并提供了统一的事务管理接口。
- MVC框架:Spring MVC是基于模型-视图-控制器设计模式的Web框架,提供了灵活的请求处理、视图解析和数据绑定等功能。
- 安全性:Spring提供了强大的安全性支持,包括认证(Authentication)和授权(Authorization)等机制,可以灵活地保护应用程序资源。
- 缓存管理:Spring支持对各种缓存技术的集成,如Ehcache、Redis等,提供了缓存抽象层,简化了缓存的使用和管理。
- 国际化和本地化:Spring提供了对多语言和本地化的支持,可以方便地实现国际化应用程序。
这些都是Spring框架的核心特性,使得Spring成为一个功能强大且灵活的开发框架。
4.Spring ioc 容器的特点:
IoC(Inversion of Control,控制反转)是Spring框架的核心概念之一。IoC容器是Spring框架提供的一个核心模块,负责对象的创建、配置和管理,实现了对象之间的松耦合。
在传统的开发模式中,当一个对象需要依赖其他对象时,该对象需要自行负责创建和管理它所依赖的对象。这种方式会导致大量的依赖关系交织在代码中,增加了代码的复杂性,同时也使得对象的创建和配置过程与核心业务逻辑紧密耦合在一起。
而IoC容器的作用是将这种对象之间的依赖关系的控制权转移到容器中,将对象的创建和配置过程解耦。开发人员只需通过配置文件或注解方式描述对象之间的依赖关系,容器负责根据配置信息进行对象的实例化和依赖注入。这意味着控制权从对象本身转移到了IoC容器,因此称之为"控制反转"。
代码演示:
pom.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>text</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>text Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <spring.version>5.0.1.RELEASE</spring.version> <javax.servlet.version>4.0.0</javax.servlet.version> <junit.version>4.12</junit.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- 2、导入spring依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!-- 5.1、junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <!-- 5.2、servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${javax.servlet.version}</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>text</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
UserService用户更改个人用户的接口
UserServiceImpl 实现类
UserServiceImpl1 实现类
UserAction 控制器:
package com.zking.ioc.web; import com.zking.ioc.service.Impl.UserServiceImpl; import com.zking.ioc.service.Impl.UserServiceImpl1; import com.zking.ioc.service.UserService; /** * @author bing人 * @site * @company xy集团 * @create 2023-08-15 16:18 * * 程序员手动实例化对象的弊端 * 1.一旦依赖的接口的实现需要大批量改动,迭代,维护成本极高 * 当接口的实现类不统一,维护成本更高 */ public class UserAction { //如果客户说没有上传头像的功能就修改UserServiceImpl为UserServiceImpl1 private UserService userService ; public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public String update(){ userService.update(); return "list"; } }
GoodsAction控制器:
package com.zking.ioc.web; import com.zking.ioc.service.Impl.UserServiceImpl; import com.zking.ioc.service.Impl.UserServiceImpl1; import com.zking.ioc.service.UserService; /** * @author bing人 * @site * @company xy集团 * @create 2023-08-15 16:26 */ public class GoodsAction { private UserService userService ; public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public String update(){ userService.update(); return "list"; } }
spring-context.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--凡是在spring配置文件spring-context.xml中配置 ,那么Javabean就交给了spring容器管理--> <bean class="com.zking.ioc.web.UserAction" id="userAction"> <property name="userService" ref="userService"></property> </bean> <bean class="com.zking.ioc.web.GoodsAction" id="goodsAction"> <property name="userService" ref="userService"></property> </bean> <bean class="com.zking.ioc.service.Impl.UserServiceImpl1" id="userService"></bean> <bean class="com.zking.ioc.service.Impl.UserServiceImpl" id="userServiceImpl"></bean> </beans>
Demo1测试类:
package com.zking.ioc.demo; import com.zking.ioc.web.GoodsAction; import com.zking.ioc.web.UserAction; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author bing人 * @site * @company xy集团 * @create 2023-08-15 16:49 */ public class Demo1 { public static void main(String[] args) { //加载spring核心配置文件(建模),获取spring的上下文对象,上下文对象中可以获取任何的javebean对象 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml"); //强转 UserAction userAction= (UserAction) context.getBean("userAction"); userAction.update(); GoodsAction goodsAction= (GoodsAction) context.getBean("goodsAction"); goodsAction.update(); } }
输出结果:
5.Spring的注入方式:
set注入 将GoodsAction中的代码修改为:
package com.CloudJun.ioc.web; import com.CloudJun.ioc.service.UserService; import java.util.List; /** * @author bing人 * @site * @company xy集团 * @create 2023-08-16 16:49 */ public class GoodsAction { /** * 例如:在不同的控制器中进行方法调用 */ private UserService userService; private String gname;//名称 private int age;//保质期 private List<String> peoples;//使用人群 public String getGname() { return gname; } public void setGname(String gname) { this.gname = gname; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public List<String> getPeoples() { return peoples; } public void setPeoples(List<String> peoples) { this.peoples = peoples; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public void pop(){ System.out.println("名称:"+this.gname); System.out.println("保证期:"+this.age); System.out.println("使用人群:"+this.peoples); } public String update(){ userService.update(); return "list"; } }
修改spring-context.xml 配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" default-autowire="byName" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean class="com.CloudJun.ioc.web.UserAction" id="userAction"> <property name="userService" ref="userServiceImpl"></property> </bean> <bean class="com.CloudJun.ioc.web.GoodsAction" id="goodsAction"> <property name="userService" ref="userServiceImpl2"></property> <property name="gname" value="小狗"></property> <property name="age" value="2"></property> <property name="peoples"> <list> <value>小红</value> <value>漂亮</value> <value>别个说的</value> </list> </property> </bean> <bean class="com.CloudJun.ioc.service.impl.UserServiceImpl" id="userService" ></bean> <bean class="com.CloudJun.ioc.service.impl.UserServiceImpl2" id="userServiceImpl2"></bean> </beans>
输出结果:
构造注入:
将UserAction中的所有代码修改为:
package com.zking.ioc.web; import com.zking.ioc.service.Impl.UserServiceImpl; import com.zking.ioc.service.Impl.UserServiceImpl1; import com.zking.ioc.service.UserService; import java.util.List; /** * @author bing人 * @site * @company xy集团 * @create 2023-08-15 16:18 * * 程序员手动实例化对象的弊端 * 1.一旦依赖的接口的实现需要大批量改动,迭代,维护成本极高 * 当接口的实现类不统一,维护成本更高 */ public class UserAction { private UserService userService ; private String uname;//姓名 private int age;//年龄 private List<String> hobby;//爱好 public UserAction() { } public UserAction(String uname, int age, List<String> hobby) { this.uname = uname; this.age = age; this.hobby = hobby; } public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } public void pop(){ System.out.println("名字为:"+this.uname); System.out.println("年龄为:"+this.age); System.out.println("爱好为:"+this.hobby); } public String update(){ userService.update(); return "list"; } }
输出结果: