Spring是一个由Rod Johnson组织开发的一个分层的Java SE/EE 一站式轻量开源框架,它是以Ioc(控制反转)和AOP(面向切面编程)为内核,使用基本的JavaBean来完成以前只可能由EJB完成的工作,取代了EJB的臃肿,低效的开发模式。
Sping致力于JavaEE应用各层的解决方案,子啊表现层提供了SpringMVC以及与Struts框架整合的功能,在业务逻辑层可以管理事务、记录日志等;在持久层可以整合Mybatis、Hibernate、JdbcTemplete等技术。
【图示结构】:
数据访问/集成层包括JDBC、ORM、OXM、JMS、和Transactions模块。
Spring的We包含WebSocket、Servlet、Web和Portlet模块。
Sping提供了两个核心容器,一个是BeanFactory另外一个是ApplicationContext。
【定义位置】:
package org.springframework.beans.factory;
【类型】: 接口类型。
【作用】: 简单来说,BeanFactory就是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用它们的生命周期方法。
【常见实现类】:
ApplicationContext是BeanFactory的子接口,也被称为应用上下文,是另外一种常用的Sping核心容器。
【定义位置】:
package org.springframework.context;
【类型】: 接口类型。
【作用】: 包含了BeanFactory的所有功能,同时还支持对国际化、资源访问、事件传播等方面的支持。
ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("配置文件名称和位置")
此时的路径不再是从类路径开始查找,而是通过参数指定配置文件的位置,如果参数使用的不是绝对路径,方法在调用的时候会默认使用绝对路径。(不推荐使用)。
FileSystemXmlApplicationContext applicationContext=new FileSystemXmlApplicationContext("配置文件名称和位置");
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>16maven.compiler.source>
<maven.compiler.target>16maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.0.8.RELEASEversion>
dependency>
dependencies>
package cn.simplelife.domain;
/**
* @ClassName Person
* @Description
* @Author simplelife
* @Date 2022/11/17 22:46
* @Version 1.0
*/
public class Person {
private Long id;
private String name;
public Person(Long id, String name) {
this.id = id;
this.name = name;
}
public Person() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public void work() {
System.out.println("疯狂写代码");
}
}
<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="person" class="cn.simplelife.domain.Person">
<property name="id" value="1"/>
<property name="name" value="李四"/>
bean>
beans>
import cn.simplelife.domain.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @ClassName PersonTest
* @Description
* @Author simplelife
* @Date 2022/11/17 22:49
* @Version 1.0
*/
public class PersonTest {
@Test
public void testPersonBySpring() {
// 1、根据配置文件启动spring容器
// 2、对象是在容器启动的时候创建的
// 3、在容器启动的时候创建的好处:
// 1、提高用户体验度
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("_01helloworld.xml");
// 2、从容器中获取对象
Person person = (Person) applicationContext.getBean("person");
// 3、使用对象
person.work();
}
}
依赖注入简称DI与控制反转Ioc描述的是同一种含义,只不过是角度不同。
当某个Java对象(调用者)需要调用另外一个Java对象(被调用者)的时,在以前的写法中,需要我们手动的去在调用者的类中new被调用者的对象来创建被调用者对象。这样的方式导致调用者和被调用者之间的耦合度增高,不利于项目的维护和升级。
在Spring被广泛使用之后,对象实例的调用不需要调用者通过new的方式创建,而是将这部分工作交给spring容器来进行创建,并且spring容器会负责控制调用者与被调用者之间的关系,不再像之前一样由调用者去控制程序之间的关系。
Spring使用setter方法注入被依赖的实例对象。通过调用无参构造器或无参静态工厂实例化Bean对象之后,调用该Bean的Setter方法,就可以实现基于setter方法的注入。
代码演示
package cn.simplelife.dao.impl;
import cn.simplelife.dao.StudentDAO;
import lombok.Cleanup;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* @ClassName StudentDAOImpl
* @Description
* @Author simplelife
* @Date 2022/11/21 11:21
* @Version 1.0
*/
public class StudentDAOImpl implements StudentDAO {
private DataSource dataSource;
// 提供set方法,在配置文件中进行注入
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public void save(String name, String password) throws SQLException {
@Cleanup
Connection connection = dataSource.getConnection();
@Cleanup
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO student(name,password)VALUES (?,?)");
preparedStatement.setString(1, name);
preparedStatement.setString(2, password);
preparedStatement.executeUpdate();
}
}
<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/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:db.properties"/>
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${password}"/>
bean>
<bean id="studentDAO" class="cn.simplelife.dao.impl.StudentDAOImpl">
<property name="dataSource" ref="druidDataSource"/>
bean>