开发者学堂课程【Java Web 开发系列课程:Spring 框架入门:01_spring_ 简介】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/538/detail/7333
01_spring_简介
内容介绍:
一、spring 介绍
二、spring 理念
三、spring 优点
四、主要内容
五、ioc——inversion of control 控制反转
一、spring 介绍
spring:春天;——给软件行业带来了春天。作者 Rod Jonhson。
Spring 代码很简单,重要在思想上。难在把框架和项目结合,难在项目的复杂程度。学习 spring 之后,还要把它结合到项目里去。
二、spring 理念
理念:是现有技术更加实用。
作者认为现有的框架已经够多了,没有必要再去创建新的框架、新的技术,把现有的框架和技术合理的运用和整合,让现有的技术运作的更好。不同的框架作用不一样,需求不一样,运用的项目的侧重点不一样。作者整合了其他框架,起到了一个粘合剂的作用,将 spring 发展完善。目前 spring 有着非常多的技术,具体可以进入 spring 官网查看。在官网里可以看到有很多组件。在 project 里面可以看见很多项目。
比如 SPING IO PLATFORM、SPRING BOOT、SPRING FRAMEWORK、SPRING XD、SPRING CLOUD、SPRING DATA、SPRING ENTEGRATION、SPRING BATCH、SPRING SECURITYD
等等等等一系列项目。
现在我们学习的是 spring framework,本身是大杂烩整合现有的框架技术。
三、Spring 优点
轻量级框架(框架不具有倾入性,倾入性就是在接触某个框架时不去实现它的接口。)轻量级框架的好处是替换它的时候,原有的代码依然可以使用,不需要改变。
提供 Ioc 容器——控制反转(Spring 的核心内容)
Aop 面向切面编程
对事务的支持:本身就支持 JDBC 等简单的事务,它还支持一些第三方的事务。
对框架的支持——Spring 本身最原始的技术就是把所有的框架整合在一起。
还有其他一些优点,在文件里面可以进行查看。
四、主要内容
首先 Spring 支持 junit 单元测试,也就是说使用 Spring 的时候不用启动服务器之类的东西。
第二是核心容器(Core Container),也是所学重点,包括核心(Core),Core 是一切的基础,包括 Beans 工厂用来创建对象的,还有上下文 Context,SpEL 是 Spring 的表达式,目前不讲。
重点是 AOP 和 Aspects。
再往上是 Spring 对 Data Access 数据访问的支持,支持 JDBC、ORM、OXM、JMS 邮件服务、Transactions 事务。还有对 Web 的支持,包括 WebSocker、Serviet、Web、Portlet,放在 MVC 里面去讲。
五、ioc——inversion of control 控制反转
打开 Java 软件,新建 Java Project,Project nam e 为 01spring4_ioc1。
点击 Finish 后点确定。之后打开 src,Java Package内Name为cn.sxt.dao。
点击 Finish。在 Java Interface 里修改 Name 为 UserDao。
点击 Finish,然后进行代码编写。具体代码如下:
p
ackage cn.sxt.dao:
public interface UserDao{
public void getUser();
}
接口需要类,先建一个类包,方便扩展,解决耦合性。
package cn.sxt.dao. impl;
import cn. sxt . dao. UserDao;
public class UserDaoImpl implements UserDao
{
@Override
public void getUser
(
) {
System. out . print1n("获取用户数据") ;
}
}
再创建一个 cn.sxt.service:
package cn. sxt. serv
i
ce
;
public interface UserService {
public void getUser
(
)
;
}
Service
里的实现是根据
dao。
package cn. sxt.service. imp
l;
import cn. sxt. dao.UserDao;
import cn. sxt .dao . impl . UserDaoImpl;
import cn. sxt. service.UserService;
public class UserServiceImpl implements UserService
{
private UserDao userDao = new UserDaoImpl
(
);
@Override
public void getUser
(
)
{
userDao. getUser
( );
}
}
不同的 dao 实现不同。一旦改变了 dao,service 里面的 dao 调用也要改变,对象是自己创建的,当改变对象时原码也要重新去写。为了不去改变原码,可以通过以下方法:
public class Test {
public static void main(String[] args) {
UserServiceImpl userService = new
UserServiceImpl
(
)
;
userService. setUserDao( new UserDaoMySqlImpl
(
)
);
userService. getUser
(
) ;
System. out.
p
rint
l
n(“--------------“);
userService . setUserDao(new UserDao0racleImpl
(
)
);
userService. getUser
(
);
}
}
以上是让程序自己去 new 一个对象的方法,除此之外还有把他放进配置文件,然后调用配置文件的方法,此时程序不用管代码,只提供一个接口。程序员不再关注对象本身的具体实现,更多的去关注业务。现在和 dao 的实现无关,直接依赖于对象的创建。
public class UserServiceImpl implements UserService{
private UserDao userDao=null ;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
通过案例:
对象由原来程序本身创建,变为了程序接收对象。
程序员主要精力集中于业务实现。
实现了 service 和 dao 的解耦工作。Service 层和 dao 层实现了分离。没有直接依赖关系。
如果 dao 的实现发生改变,应用程序本身不用改变。