Spring:JavaEE开发的一站式框架,针对开发的每一层都有解决方案。
- web层:SpringMVC
- service层:Spring的bean管理,声明式事务管理
- dao层:Spring的jdbc模板,Spring的ORM模块
Ioc:Inversion of Control(控制反转)
控制反转:将对象的创建权交给spring管理
好处:降低程序间的耦合度
IOC入门案例:创建一个maven工程
dao接口UserDao
public interface UserDao {
/*
* dao层保存用户
* */
void saveUser();
}
dao接口实现类UserDao
public class UserDaoImpl implements UserDao {
/*
* 模拟保存用户
* */
public void saveUser() {
System.out.println("dao层保存用户...成功");
}
}
service接口UserService
public interface UserService {
/*
* 保存用户
* */
void saveUser();
}
service接口实现类UserServiceImpl
public class UserServiceImpl implements UserService {
/*
* 模拟保存用户
* */
public void saveUser() {
System.out.println("service层保存用户...成功");
}
}
bean.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标签:用于配置让spring创建对象,并且存入ioc容器之中
id属性:对象的唯一标识,标识单个bean定义的字符串。
class属性:定义Bean的类型,并使用完全限定的类名
-->
<!-- 配置dao对象 -->
<bean id="userDao" class="com.yt.dao.impl.UserDaoImpl"></bean>
<!-- 配置service对象 -->
<bean id="userService" class="com.yt.service.impl.UserServiceImpl"></bean>
</beans>
pom文件
<dependencies>
<!---->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
</dependencies>
测试类IocTest :
public class IocTest {
public static void main(String[] args) {
//使用ApplicationContext接口获取spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
//根据bean的id获取对象
UserService service = (UserService) context.getBean("userService");
//调用方法该对象中的保存方法
service.saveUser();
System.out.println(service);
UserDao dao = (UserDao) context.getBean("userDao");
dao.saveUser();
System.out.println(dao);
}
}
运行结果:
IOC和DI(面试会问)
IOC:控制反转,将对象的创建权反转给了Spring。
DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
BeanFactory和ApplicationContext的区别:
BeanFactory 是 Spring 容器中的顶层接口,ApplicationContext 是它的子接口。
两者区别: 创建对象的时间点不一样。
ApplicationContext:实现是立即加载的方式,只要一读取配置文件,默认情况下就会创建对象。
BeanFactory:实现是懒加载的方式,只有调用getBean()方法的时候,才会生成类的实例。
ApplicationContext 接口的实现类:
ClassPathXmlApplicationContext:它是从类的根路径下加载配置文件推荐使用这种方式。
FileSystemXmlApplicationContext:它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置(必须要有访问权限)。
AnnotationConfigApplicationContext:当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
Bean的相关的配置:
作用:用于配置对象让 spring容器来创建的,默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。
属性:
id:使用了约束中的唯一约束。里面不能出现特殊字符的。
name:没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的),里面可以出现特殊字符。
class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
加油吧少年