Spring的入门学习。
1、Spring
一句话概括:Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。
- Ioc(控制反转):原来所有的对象都是程序来创建,控制权在程序手中,通过Spring可以将控制权转换到用户手中,用户需要什么对象只需要在配置文件中配置即可。
- AOP(面向切面): 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
以下内容摘自秦老师的博客:
组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
- 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是
BeanFactory
,它是工厂模式的实现。BeanFactory
使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 - Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
- Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
- Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
- Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
- Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
- Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
2、Spring的依赖
1 | <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> |
3、初次尝试
通常的web项目都是写一个接口,然后根据需求写实现类,当需求改变时,需要改动程序来满足需求,但是这样的成本比较大,而Spring通过控制反转,将对象的实例化的控制权给到用户手中,用户需要什么对象在xml中配置即可。
实例:获取用户信息。
dao
UserDao
1
2
3
4
5package com.nevesettle.dao;
public interface UserDao {
void getUser();
}UserDaoImp
1
2
3
4
5
6
7
8package com.nevesettle.dao;
public class UserDaoImp implements UserDao {
public void getUser() {
System.out.println("默认获取用户信息");
}
}UserDaoMysqlImp
1
2
3
4
5
6
7
8package com.nevesettle.dao;
public class UserDaoMysqlImp implements UserDao{
public void getUser() {
System.out.println("Mysql实现获取用户信息");
}
}
Service
UserService
1
2
3
4
5package com.nevesettle.service;
public interface UserService {
void getUser();
}UserServiceImp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package com.nevesettle.service;
import com.nevesettle.dao.UserDao;
public class UserServiceImp implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}此时需要哪个具体的实现类不指定,不让程序来实例化对象,而是由用户来给程序指定生成哪个实现类,从而实现了控制反转。
xml配置文件(在resources中创建)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="hello" class="com.nevesettle.pojo.Hello">
<property name="name" value="Spring"/>
</bean>
<bean id="userdao" class="com.nevesettle.dao.UserDaoImp"/>
<bean id="mysqlDao" class="com.nevesettle.dao.UserDaoMysqlImp"/>
<bean id="userService" class="com.nevesettle.service.UserServiceImp">
<!-- ref的引用哪个对象-->
<property name="userDao" ref="mysqlDao"/>
</bean>
</beans>test
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import com.nevesettle.dao.UserDaoImp;
import com.nevesettle.service.UserService;
import com.nevesettle.service.UserServiceImp;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args){
//获取上下文,第一步
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//获取对象,获取什么对象就在getBean中传入对象的名称,然后再强转
UserService userService = (UserService) context.getBean("userService");
userService.getUser();
}
}此时就会输出:
1
Mysql实现获取用户信息
因为在配置文件中配置的是mysqlDao实现类,所以执行的是mysqlDao的方法,当需求改变时,程序无需做出更改,只需要在配置文件中将引用改为其他的实现类即可,这便是Ioc。