前言
Spring是一个轻量级的框架
一、Spring体系结构介绍
四大框架:SpringIOC,SpringMVC,JDBC,SpringAOP
先来学SpringIOC:
问题:能不能做到不修改MyServlet任何代码 实现用户名查询切换
解决方案:
1.把类名写到一个配置文件
2.MyServlet通过代码去读配置文件,反射可以动态的创建对象(提供类名)
Spring框架(控制反转IOC)帮我们完成了1+2
二、使用Spring框架
1.导包
导入目录:
导入地点:
导入代码:
<!-- SpringIOC依赖包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.22</version>
</dependency>
学习1:控制反转(IOC):
现在要创建一个配置文件
’
在创建的xml文件中写入如下代码:
<!-- 配置类名 Spring创建对象-->
<bean class="org.example.dao.impl.UserDaoImpl" id="userDao" scope="prototype">
</bean>
在app文件中,写入如下代码:
// UserDao userDao = new UserDaoImpl();
// 读配置文件,并把配置文件中配的读到的类名创建该对象
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 里氏替换原则
// 单例模式(创建同一个对象)
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
System.out.println(userDao.findUser());
学习笔记:
控制反转IOC:
在使用Spring框架后,对象的实例不再由调用者创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是控制反转。
Spring作用域:
学习2:依赖注入(DI):
例一:
在app中,输入以下代码:
// 一般不直接调用dao -> 通过service来调用dao
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
UserService userService = (UserService) applicationContext.getBean("userService");
// userService.setUserDao(userDao);
System.out.println(userService.findUser());
而在配置文件中,输入一下代码:
<bean class="org.example.service.UserService" id="userService">
<!-- 对象间的关联关系-->
<property name="userDao" ref="userDao"/>
</bean>
其中的ref标签通过其中的值找到userDao,并替代,这样,就不需要在app类中setUserDao了
还有另外一种方法:
<bean class="org.example.service.UserService" id="userService" autowire="byName">
<!-- 对象间的关联关系-->
<!-- <property name="userDao" ref="userDao"/>-->
</bean>
使用autowire="byName"标签来以id来匹配(自动装配)
例二:
控制文件:
<bean class="org.example.Person" id="person">
<property name="age" value="20"/>
<property name="name" value="testname"/>
</bean>
person类:
package org.example;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
app中:
Person person = (Person) applicationContext.getBean("person");
System.out.println(person.getAge());
System.out.println(person.getName());
学习笔记:
依赖注入(DI):
从Spring容器角度来看,Spring容器负责将被依赖的对象复制给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入。
自动装配:
学习3:注解:
person类中:
package org.example;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//Component Spring 容器创建对象
//注解默认不生效 -> 开启注解
@Component
public class Person {
@Value("20")
private String name;
@Value("TestName")
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;`在这里插入代码片`
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
配置文件中(开启注解):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.example"/>
app中:
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) applicationContext.getBean("person");
System.out.println(person.getAge());
System.out.println(person.getName());