文章目录
- 1. 了解 spring(Spring Framework)
- 2. 基于maven搭建Spring框架
- 2.1 纯xml配置方式来实现Spring
- 2.2 注解方式来实现Spring
- 3. Java Config类来实现Spring
- 2.4 总结
springSpring_Framework_3">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>
各个类的参考代码如下:
java">package com.lize.dao;public class UserDao {public void printUserD(){System.out.println("UserDao");}
}
java">package com.lize.service;import com.lize.dao.UserDao;public class UserService {private UserDao ud = new UserDao();public void printUserS(){ud.printUserD();}
}
测试代码如下:
java">import com.lize.service.UserService;
import org.junit.Test;public class Test01 {@Testpublic 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/beanshttp://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方法。
java">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。
java">import com.lize.service.UserService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test01 {@Testpublic 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.xsdhttp://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”,如下:
java">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 {@Autowiredprivate UserDao ud;public void printUserS(){ud.printUserD();}
}
使用注解“Autowired"自动导入,不需要再写set方法,运行代码不需要修改。
3. Java Config类来实现Spring
在2的基础上,abc.xml可以不需要了,此时只需要定义一个配置类,如下:
java">package com.lize.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
// 表明这是一个配置类
@ComponentScan("com.lize")
// 需要扫描的包
public class SpringConfig {
}
运行方式如下:
java">import com.lize.config.SpringConfig;
import com.lize.service.UserService;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Test01 {@Testpublic void test2(){AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);UserService us = (UserService) context.getBean("userService");us.printUserS();}
}
2.4 总结
第一种方式基于xml文件实现控制反转,需要在xml文件定义大量的bean;第二种方式只需要在xml文件添加扫描标签,并且需要在对应的类上添加注解;第三种方式需要定义配置类,在配置类上添加对应注解,通过注解的方式去扫描对应包下的对应类。Spring Boot基于第三种方式再进一步封装实现的。