SpringIoc
1.Spring:
概念:Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。
理念: 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术。
组成:
- 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
- Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
- Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
- Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
- Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
- Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
- Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
2.Ioc思想:
- 控制反转:获得对象的方式反转了,我们之前是new出一个对象,对象的创建由程序控制,控制反转将主动权交给第三方,由第三方创建对象。实现控制反转的主要方式是依赖注入。
- 理解思想:
先写实体类user
package com.bluemsun.entity;
public class User {
private int uid;
private String name;
private int age;
public User() {
}
public User(int uid, String name, int age) {
this.uid = uid;
this.name = name;
this.age = age;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
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;
}
}
dao层接口
package com.bluemsun.dao;
import com.bluemsun.entity.User;
public interface UserDao {
void f();
User getUserById(int uid);
User printMessage(User user);
}
dao层实现类
A:
package com.bluemsun.dao;
import com.bluemsun.entity.User;
public class UserDaoImplA implements UserDao{
@Override
public void f() {
System.out.println("这是第一个");
}
@Override
public User getUserById(int uid) {
return null;
}
@Override
public User printMessage(User user) {
return null;
}
}
B:
package com.bluemsun.dao;
import com.bluemsun.entity.User;
public class UserDaoImplB implements UserDao{
@Override
public void f() {
System.out.println("这是第二个");
}
@Override
public User getUserById(int uid) {
return null;
}
@Override
public User printMessage(User user) {
return null;
}
}
现在有两个实现类,如果我们用以前的方法去调用:
package com.bluemsun.service;
import com.bluemsun.dao.UserDao;
import com.bluemsun.dao.UserDaoImplA;
public class UserService {
private UserDao userDao = new UserDaoImplA();
public void getUser(){
userDao.f();
}
}
这就导致如果我要使用UserDao的另一个实现类时,就需要去service层更改代码。如果有许多实现类,我们每更换一次,就要修改一次代码,这种设计的耦合性太高了, 牵一发而动全身 。
做如下修改:
package com.bluemsun.service;
import com.bluemsun.dao.UserDao;
import com.bluemsun.dao.UserDaoImplA;
public class UserService {
// private UserDao userDao = new UserDaoImplA();
private UserDao userDao;
void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void getUser(UserDao userDao){
userDao.f();
}
}
如果我们需要更换实现类,只需要利用set方法传入参数设置实现类即可。与之前的区别是对象的创建不是由程序决定,而是由我们决定。
3.SpringIoc
- 导入jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
- 编写User实体类
package com.bluemsun.entity;
public class User {
private int id;
private String name;
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 编写spring文件,可命名为beans.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">
<bean id="user" class="com.bluemsun.entity.User">
<property name="id" value="1"/>
<property name="name" value="zxy"/>
</bean>
</beans>
- 测试
package com.bluemsun;
import com.bluemsun.entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
@org.junit.Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = (User) context.getBean("user");
System.out.println(user.getName());
}
}
User对象由spring创建,user里的属性由spring容器设置,这个过程就叫控制反转。
控制: 控制对象的创建,传统的对象是由代码本身硬性创建出来的,使用spring后由spring创建。
反转: 程序本身不创建对象,而是被动地接收对象。
依赖注入:利用set方法来进行注入。
4.Ioc创建对象方式:
- 使用无参构造:
User类
package com.bluemsun.entity;
public class User {
private String name;
private int age;
public User() {
System.out.println("这是无参构造");
}
public User(String name, int age) {
this.name = name;
this.age = age;
System.out.println("这是有参构造");
}
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;
}
}
beans.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">
<bean id="user" class="com.bluemsun.entity.User">
<property name="name" value="zxy"/>
<property name="age" value="18"/>
</bean>
</beans>
Test
package com.bluemsun.entity;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
@org.junit.Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user1 = (User)context.getBean("user");
User user2 = (User) context.getBean("user");
}
}
- 有参构造
<bean id="user" class="com.bluemsun.entity.User">
<constructor-arg index="1" value="11"/>
<constructor-arg index="0" value="zzz"/>
</bean>
// 根据下标构造
<bean id="user" class="com.bluemsun.entity.User">
<constructor-arg name="age" value="11"/>
<constructor-arg name="name" value="zzz"/>
</bean>
// 根据参数名构造
<bean id="user" class="com.bluemsun.entity.User">
<constructor-arg type="java.lang.String" value="zzz"/>
<constructor-arg type="int" value="11"/>
</bean>
// 根据参数类型构造
在配置文件加载的时候,其中管理的对象就已经初始化了。
5.alias设置别名和import导入配置文件:
<alias name="user" alias="u"/>
<import resource="beanss.xml"/>
6.其他注入:
- 数组注入
<property name="s">
<array>
<value>阿巴阿巴</value>
<value>歪比巴不</value>
<value>hahaha</value>
</array>
</property>
- list注入
<property name="list">
<list>
<value>111</value>
<value>222</value>
<value>333</value>
</list>
</property>
- map注入
<property name="map">
<map>
<entry key="a" value="b"/>
<entry key="c" value="d"/>
</map>
</property>
- set注入
<property name="games">
<set>
<value>LOL</value>
<value>BOB</value>
<value>COC</value>
</set>
</property>
- Null注入
<property name="wife"><null/></property>
- Properties注入
<property name="info">
<props>
<prop key="学号">20190604</prop>
<prop key="性别">男</prop>
<prop key="姓名">小明</prop>
</props>
</property>
7.p、c命名注入:
导入约束 : xmlns:p="http://www.springframework.org/schema/p"
<bean id="address" class="com.bluemsun.entity.Address" p:address="wwwwwww"/>
导入约束 : xmlns:c="http://www.springframework.org/schema/c"
<bean id="address" class="com.bluemsun.entity.Address" c:address="wwwwwww"/>
8.Bean作用域:
9.自动挂载 byname、bytype
10.和MyBatis整合
- 导入jar包
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
剩下的看代码吧。
参考博客:https://blog.csdn.net/weixin_44207403/article/details/106736102