- 什么是spring?
spring是一个开源的面向切面(AOP)和控制反转(IOC)的容器框架,用来简化企业级的开发。帮助开发者解决开发中基础性的问题,专注于应用程序的开发。
为什么使用Spring?
降低组件之间的耦合度,实现软件各层之间的解耦合。
Controller层->Service层->Dao层
让代码结构更良好
高低原则:高内聚,低耦合
开闭原则:对扩张开放,对修改关闭
提供了许多技术框架
提供了各种服务:事务管理服务,消息服务
提供了单例模式
提供了Aop技术
对主流框架提供了集成支持
继承Mybatis,Hibernate,Struts等
Spring体系结构
IOC AOP Data Acess Web
IOC (Inversion of controller)控制反转
public class UserDaoServiceImpl{
//userDao由service创建维护
private userDao userDao = new UserDao();
public void reist(User user){
userDao.save(user);
}
}
控制反转就是指本身不负责对象的创建和维护,依赖对象的创建和维护交给外部容器来负责,这种控制权发生了转移,就是控制反转
IOC:把对象的创建,初始化,销毁交给spring来管理,而不是由开发者控制,实现控制反转。
spring框架IOC容器的基础由org.springframework.beans包和org.springframework.context包构成,BeanFactory接口是SpringIOCF容器的核心接口,
外部容器/IOC容器 ,存储对象(bean)的容器
DI(dependency injection)依赖注入
public class UserDaoServiceImpl{
//userDao由外部容器创建和维护
private userDao userDao;
//让容器创建好的对象注入到service中
public void setUserDao(User user){
this.userDao = userDao;
}
public void reist(User user){
userDao.save(user);
}
}
依赖注入就是在运行期间,由外部容器动态的将依赖对象注入到组件中。
依赖注入是控制反转的基础。
java中依赖注入三种实现方式:构造器注入,setter方法注入,接口注入
在spring框架中解释IOC?
Spring中的org.springframework.beans包和org.springframework.context包构成了spring框架IOC容器的基础。
BeanFactory接口提供了一个先进的配置机制,是得任何类型的对象的配置成为可能,ApplicationContext接口对BeanFactory进行了扩展,在BeanFactory的基础上添加了其他功能,比如与spring的AOP的集成,也提供了message resource的机制,事件传播以及应用层的特别配置,比如针对Web应用的WebApplicationContext,
springIOC第一个案例
先添加jar包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<!--spring-core-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<!--spring-bean-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<!--spring-context-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<!--spring-expression-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
</dependency>
</dependencies>
第二步创建配置文件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">
</beans>
第三步书写一个类HelloSpring
package com.ioc01;
/**
* package_name:com.ioc01
* Author:徐亚远
* Date:2020/1/19 10:48
* 项目名:springDemo01
* Desription:
**/
public class HelloSpring {
private String name;
private String age;
//为bean中的属性注入值 本质上是通过setter方法注入的
public void setAge(String age) {
this.age = age;
}
//为bean中的属性注入值 本质上是通过setter方法注入的
public void setName(String name) {
this.name = name;
}
public void show() {
System.out.println("姓名:" + name + " ; " + "年龄:" + age);
}
}
第四步 配置applicationContext.xmll文件
<?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)-->
<bean id="HelloSpring" class="com.ioc01.HelloSpring">
<!--为bean中的属性注入值 本质上是通过setter方法注入的-->
<property name="name" value="徐亚远"/>
<property name="age" value="23"/>
</bean>
</beans>
第五步书写测试方法HelloSpringTest01
package com.ioc01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* package_name:com.ioc01
* Author:徐亚远
* Date:2020/1/19 10:50
* 项目名:springDemo01
* Desription:
**/
public class HelloSpringTest01 {
public static void main(String args []){
/* 未使用springIOC的时候需要我们自己手动的去创建对象,然后调用对象的方法
HelloSpring helloSpring = new HelloSpring();
helloSpring.show();*/
//先获取获取IOC容器,读取配置文件,初始化spring上下文
ApplicationContext ac = new ClassPathXmlApplicationContext("ioc01/applicationContext.xml");
//根据id获取容器中的bena
HelloSpring helloSpring = (HelloSpring) ac.getBean("HelloSpring");
helloSpring.show();
}
}
运行结果如图:
目录结构如图: