文章目录
- 1. 了解 spring(Spring Framework)
- 2. 基于maven搭建Spring框架
- 2.1 纯xml配置方式来实现Spring
- 2.2 注解方式来实现Spring
- 3. Java Config类来实现Spring
- 2.4 总结
1. 了解 spring(Spring Framework)
传统方式构建spring(指的是Spring Framework)项目,导入依赖繁琐(需要自行去maven官网去下载依赖或者copy对应的依赖,并且各个依赖之间可能还存在版本冲突的问题)、项目配置繁琐(需要添加一些配置文件,且配置文件中需要写一些重复的代码,总之很繁琐)。
而Spring Boot简化了上述操作,比如之前的Spring项目中整合mybatis时,需要在配置文件中定义对应的bean才行,而使用Spring Boot之后,(在引入对应依赖的前提下)只需要在application.yml中添加一些数据库连接的对应信息及其他一些配置,然后就可以实现同样的效果了。
上述只是对于两者做的一个简单比较。
说到Spring,应该联想到IOC(控制反转)、DI(依赖注入)。所谓控制反转(对象创建权力),一个类需要用到另外一个类的对象,通常做法是在这个类下new另外一个类对象,但是这样会让这两个对象产生一个强关联,它们之间就建立了强耦合的关系,而代码之间的耦合度越高,对越后期维护越不利。而使用了Spring之后,可以把类放到容器中进行管理,需要用到某个类时只需要把这个类进行依赖注入即可,从而降低耦合度。
2. 基于maven搭建Spring框架
使用idea创建一个maven项目,这只是一个例子,项目结构如下:
导入junit依赖,如下:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
各个类的参考代码如下:
package com.lize.dao;
public class UserDao {
public void printUserD(){
System.out.println("UserDao");
}
}
package com.lize.service;
import com.lize.dao.UserDao;
public class UserService {
private UserDao ud = new UserDao();
public void printUserS(){
ud.printUserD();
}
}
测试代码如下:
import com.lize.service.UserService;
import org.junit.Test;
public class Test01 {
@Test
public void test(){
UserService userService = new UserService();
userService.printUserS();
}
}
2.1 纯xml配置方式来实现Spring
下面使用Spring方式来降低上述代码耦合度。首先,添加spring的对于依赖。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
在resources文件夹下面创建一个xml文件,在xml文件添加对应的bean标签即可。
<?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-4.0.xsd">
<bean class="com.lize.dao.UserDao" name="userDao"/>
<bean class="com.lize.service.UserService" name="userService">
<property name="ud" ref="userDao"/>
<!-- ud为对应的service文件的变量名 -->
</bean>
</beans>
当然对应service文件也需要修改,添加set方法。
package com.lize.service;
import com.lize.dao.UserDao;
public class UserService {
private UserDao ud;
public void setUd(UserDao ud) {
this.ud = ud;
}
public void printUserS(){
ud.printUserD();
}
}
运行代码如下,从abc.xml文件获取对应容器对象,然后从这个对象中获取对应的bean。
import com.lize.service.UserService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test01 {
@Test
public void test(){
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("abc.xml");
UserService us = (UserService) ctx.getBean("userService");
us.printUserS();
}
}
2.2 注解方式来实现Spring
此时abc.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"
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="com.lize"/>
<!-- dao、service包在这个目录下,spring容器会自动扫描,当然需要在
对应类上添加注解 -->
</beans>
此时在dao、service对应的类上添加注解“@Component”,如下:
package com.lize.service;
import com.lize.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class UserService {
@Autowired
private UserDao ud;
public void printUserS(){
ud.printUserD();
}
}
使用注解“Autowired"自动导入,不需要再写set方法,运行代码不需要修改。
3. Java Config类来实现Spring
在2的基础上,abc.xml可以不需要了,此时只需要定义一个配置类,如下:
package com.lize.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
// 表明这是一个配置类
@ComponentScan("com.lize")
// 需要扫描的包
public class SpringConfig {
}
运行方式如下:
import com.lize.config.SpringConfig;
import com.lize.service.UserService;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test01 {
@Test
public void test2(){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService us = (UserService) context.getBean("userService");
us.printUserS();
}
}
2.4 总结
第一种方式基于xml文件实现控制反转,需要在xml文件定义大量的bean;第二种方式只需要在xml文件添加扫描标签,并且需要在对应的类上添加注解;第三种方式需要定义配置类,在配置类上添加对应注解,通过注解的方式去扫描对应包下的对应类。Spring Boot基于第三种方式再进一步封装实现的。