1.简介
Spring 是 Java EE 编程领域的一款轻量级的开源框架,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,它的目标就是要简化 Java 企业级应用程序的开发难度和周期。
maven依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.20</version>
</dependency>
Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的免费开源框架。
官方文档:Spring Framework 中文文档 - Spring Framework 5.1.3.RELEASE Reference | Docs4dev
2.IOC理论推导
原来实现业务:
UserDao
public interface UserDao {
void getUser();
}
UserDaoImpl
@Override
public void getUser() {
System.out.println("默认实现");
}
UserService
public interface UserService {
void getUser();
}
UserServiceImpl
public class UserServiceImpl implements UserService{
private UserDao userDao=new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
测试
public class Test {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
userService.getUser();
}
}
那么如果此时 再添加一个业务
public class UserDaoMysqlImpl implements UserDao{
@Override
public void getUser() {
System.out.println("Mysql实现");
}
}
我们就需要去Service层去修改
private UserDao userDao=new UserDaoMysqlImpl();
这样的话,我们需要根据用户的需求去修改原代码,那么如果代码量十分巨大,会造成昂贵的成本。
我们使用set接口来实现:
private UserDao userDao;
//利用set进行动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public class Test {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
((UserServiceImpl)userService).setUserDao(new UserDaoMysqlImpl());
userService.getUser();
}
}
之前,程序是主动创建对象,使用set注入之后,程序不再具有主动性,变为了被动的接受对象
ioc本质:控制反转(ioc)是一种思想,DI(依赖注入)是实现ioc的一种方法。
3.HelloSpring
实体类
package com.hongkai.pojo;
public class Hello {
private String str;
public Hello(String str) {
this.str = str;
}
public Hello() {
}
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
@Override
public String toString() {
return "Hello{" +
"str='" + str + '\'' +
'}';
}
}
1.配置元数据
基于 XML 的配置元数据的基本结构 resource/ApplicationContext.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来创建对象(bean)-->
<bean id="hello" class="com.hongkai.pojo.Hello">
<property name="str" value="Spring"></property>
</bean>
</beans>
2.实例化容器
提供给ApplicationContext
构造函数的位置路径是资源字符串,这些资源字符串使容器可以从各种外部资源(例如本地文件系统,Java CLASSPATH
等)加载配置元数据
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
public class MyTest {
public static void main(String[] args) {
//获取Spring上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
//现在对象都由Spring来管理了
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello.toString());
}
}
问题:Hello对象是谁创建的?Hello对象的属性怎么设置的?
之前我们new一个对象:类型 变量名=new 类型() Hello hello=new Hello();
现在我们交给Spring来做:使用bean标签 id=变量名 class=new 的对象 property相当于给对象中的属性设置一个值;
这个过程就是控制反转:
控制:控制对象的创建,传统的由程序本身来创建,使用Spring后,由Spring来创建
反转:程序本身不创建对象,而变成被动的接收对象
依赖注入:利用set方法来进行注入 如果实体类里没有set方法就无法给对象中的属性设置值
IOC是一种编程思想,由主动创建变成被动接收
4.IOC创建对象的方式
1.默认方式 使用无参构造器
2.有参构造器
public User(String userName, int age) {
this.userName = userName;
this.age = age;
}
2.1构造函数参数索引
<bean id="user" class="com.hongkai.pojo.User">
<constructor-arg index="0" value="李四"/>
<constructor-arg index="1" value="22"/>
</bean>
2.2构造函数参数类型匹配
<bean id="user" class="com.hongkai.pojo.User">
<constructor-arg type="String" value="王五"/>
<constructor-arg type="int" value="42"/>
</bean>
2.3构造函数参数名称
<bean id="user" class="com.hongkai.pojo.User">
<constructor-arg name="userName" value="老六"/>
<constructor-arg name="age" value="55"/>
</bean>
小总结:在配置文件加载的时候,容器中管理的对象就已经初始化了。
5.Spring配置
1.别名 alias
<bean id="user" class="com.hongkai.pojo