Spring初识及其IOC入门
一.框架
框架是一些类和接口的集合,它一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架时直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度。
二.Spring
2.1.架构的演进:

单一应用架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服 务框架(RPC)是关键。
流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是 关键。
2.2.spring
2.2.1.核心解释
spring是一个轻量级开源框架。
spring是为了简化企业开发而生的,使得开发变得更加优雅和简洁。
spring是一个IOC和AOP的容器框架。
IOC:控制反转
AOP:面向切面编程
容器:包含并管理应用对象的生命周期,就好比用桶装水一样,spring就是桶,而对象就是水
2.2.2.使用spring的优点
- Spring通过DI、AOP和消除样板式代码来简化企业级Java开发
- Spring框架之外还存在一个构建在核心框架之上的庞大生态圈,它将Spring扩展到不同的领域,如Web服务、REST、移动开发以及NoSQL
- 低侵入式设计,代码的污染极低
- 独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
- Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦
- Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式处理,从而提供了更好的复用
- Spring的ORM和DAO提供了与第三方持久层框架的的良好整合,并简化了底层的数据库访问
- Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
2.3.IOC(inversion of controller) 控制反转
2.3.1.为什么要学习IOC
创建一个普通的java项目,实现service层调dao层,dao层是可扩展的。
1.UserDao.java
1 package com.zyj.dao;
2
3 /**
4 * @author zyj
5 * @Package com.zyj.dao
6 */
7 public interface UserDao {
8 public void getUser();
9 }
2.UserDaoImpl.java
1 package com.zyj.dao.impl;
2
3 import com.zyj.dao.UserDao;
4
5 /**
6 * @author zyj
7 * @Package com.zyj.dao.impl
8 */
9 public class UserDaoImpl implements UserDao {
10 @Override
11 public void getUser() {
12 System.out.println("查询数据.....");
13 }
14 }
3.UserService.java
package com.zyj.service; /**
* @author zyj
* @Package com.zyj.service
*/
public interface UserService {
public void getUser();
}
4.UserServiceImpl.java
package com.zyj.service.impl; import com.zyj.dao.UserDao;
import com.zyj.dao.impl.UserDaoImpl;
import com.zyj.dao.impl.UserDaoMysqlImpl;
import com.zyj.service.UserService; /**
* @author zyj
* @Package com.zyj.service.impl
*/
public class UserServiceImpl implements UserService {
private UserDao ud = new UserDaoImpl();
@Override
public void getUser() {
ud.getUser();
}
}
5.测试类
1 package com.zyj.test;
2
3 import com.zyj.service.UserService;
4 import com.zyj.service.impl.UserServiceImpl;
5
6 /**
7 * @author zyj
8 * @Package com.zyj.test
9 */
10 public class MyTest {
11 public static void main(String[] args) {
12 UserService us = new UserServiceImpl();
13 us.getUser();
14 }
15 }
6.运行

7.如果此时要新增dao,例如新增UserDaoMysqlImpl.java,则对应的UserServiceImpl势必要改动
1 package com.zyj.service.impl;
2
3 import com.zyj.dao.UserDao;
4 import com.zyj.dao.impl.UserDaoImpl;
5 import com.zyj.dao.impl.UserDaoMysqlImpl;
6 import com.zyj.service.UserService;
7
8 /**
9 * @author zyj
10 * @Package com.zyj.service.impl
11 */
12 public class UserServiceImpl implements UserService {
13 // private UserDao ud = new UserDaoImpl();
14 private UserDao ud = new UserDaoMysqlImpl();
15 @Override
16 public void getUser() {
17 ud.getUser();
18 }
19 }
8.如果项目需要,还要新增dao,例如新增UserDaoOracleImpl.java,则UserServiceDao势必还要修改,如果项目大的话会造成很大的工作量。很显然这种方式已经不适用。可以采用如下的方式。
修改UserServiceImpl.java
1 package com.zyj.service.impl;
2
3 import com.zyj.dao.UserDao;
4 import com.zyj.dao.impl.UserDaoImpl;
5 import com.zyj.dao.impl.UserDaoMysqlImpl;
6 import com.zyj.service.UserService;
7
8 /**
9 * @author zyj
10 * @Package com.zyj.service.impl
11 */
12 public class UserServiceImpl implements UserService {
13 // private UserDao ud = new UserDaoImpl();
14 // private UserDao ud = new UserDaoMysqlImpl();
15 private UserDao ud;
16 public void setUserDao(UserDao userDao){
17 this.ud = userDao;
18 }
19 @Override
20 public void getUser() {
21 ud.getUser();
22 }
23 }
9.在测试类中,new出来UserDaoOracleImpl类对象,然后调UserServiceImpl类的setUerDao方法的方式来创建对象,MyTest.java修改如下:
1 package com.zyj.test;
2
3 import com.zyj.dao.UserDao;
4 import com.zyj.dao.impl.UserDaoOracleImpl;
5 import com.zyj.service.UserService;
6 import com.zyj.service.impl.UserServiceImpl;
7
8 /**
9 * @author zyj
10 * @Package com.zyj.test
11 */
12 public class MyTest {
13 public static void main(String[] args) {
14 UserServiceImpl us = new UserServiceImpl();
15 UserDao ud = new UserDaoOracleImpl();
16 us.setUserDao(ud);
17 us.getUser();
18 }
19 }
10.运行

总结:一言以蔽之。从上面的代码中我们可以看到解耦(降低程序之间额依赖)的重要性,而使用Spring的IOC可以降低程序之间的耦合性,并提升开发效率,降低成本。
2.3.2.IOC的概念
IOC与大家熟知的依赖注入(DI)同理,这是一个通过依赖注入对象的过程,也就是说,他们所使用的对象,是通过构造函数参数,工厂方法的参数或者是从工厂方法的构造函数或返回值的对象实例设置的属性,然后容器在创建bean时注入这些需要的依赖,这个过程相对于普通创建对象的过程时反向的,bean本身通过直接构造类来控制依赖关系的实例化或位置,或提供诸如服务定位器模式之类的机制。通俗说法:就是我们开发程序时将通过new关键字创建对象的方式交由spring去管理,即spring的IOC(控制反转)。
2.3.3.DI和IOC
很多人把IOC和DI说成一个东西,笼统来说的话是没有问题的,但是本质上还是有所区别的,IOC和DI是从不同的角度描述的同一件事,IOC是从容器的角度描述,而DI是从应用程序的角度来描述,也可以这样说,IOC是设计思想,而DI是具体的实现方式。
2.3.4.IOC基本案例
要求:通过springIOC实现对象的创建,及其属性的赋值
代码实例:
1.Persion.java实体类
1 package com.zyj.entity;
2
3 import org.springframework.core.env.SystemEnvironmentPropertySource;
4
5 /**
6 * @author zyj
7 * @Package com.zyj.entity
8 */
9 public class Persion {
10 private int id;
11 private String username;
12 private int age;
13 private String address;
14
15 public int getId() {
16 return id;
17 }
18
19 public String getUsername() {
20 return username;
21 }
22
23 public int getAge() {
24 return age;
25 }
26
27 public String getAddress() {
28 return address;
29 }
30
31 public void setId(int id) {
32 this.id = id;
33 }
34
35 public void setUsername(String username) {
36 this.username = username;
37 }
38
39 public void setAge(int age) {
40 this.age = age;
41 }
42
43 public void setAddress(String address) {
44 this.address = address;
45 }
46
47 @Override
48 public String toString() {
49 return "persion{" +
50 "id=" + id +
51 ", username='" + username + '\'' +
52 ", age=" + age +
53 ", address='" + address + '\'' +
54 '}';
55 }
56 public Persion(){
57 System.out.println("我被创建了......");
58 }
59 }
2.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId>
<artifactId>springIOC_01</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
</project>
3.编写的配置文件ioc.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标签用于创建bean对象,其id属性表示唯一值,class属性表示要实例化对象的绝对地址-->
<bean id="persion" class="com.zyj.entity.Persion">
<!--perperty标签用于给属性值赋值,name代表实体的属性名称,value表示实体属性的赋值-->
<property name="id" value="1"></property>
<property name="username" value="赵亚军"></property>
<property name="age" value="18"></property>
<property name="address" value="北京北京"></property>
</bean>
</beans>
4.测试启动类
1 package com.zyj.application;
2
3 import com.zyj.entity.Persion;
4 import org.springframework.context.ApplicationContext;
5 import org.springframework.context.support.ClassPathXmlApplicationContext;
6
7 /**
8 * @author zyj
9 * @Package com.zyj.application
10 */
11 /*
12 * ????Sping IOC是什么时候创建的对象??
13 *在读取spring的配置文件的时候就已经创建了java对象
14 * */
15 public class MyApplication {
16 public static void main(String[] args) {
17 /**
18 * ApplicationContext是IOC容器的入口类,要获取ioc容器中的对象必须常见该类
19 * ClassPathXmlApplicationContext该类是读取spring的xml配置文件的
20 */
21 ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml");
22 //获取ioc容器中的具体对象,需要强制类型转换
23 // Persion persion = (Persion)context.getBean("persion");
24 //获取ioc容器中的对象,不需要强制类型转换
25 Persion persion = context.getBean("persion",Persion.class);
26 System.out.println(persion);
27 }
28 }
5.执行结果

6.想看下java对象是通过spring什么时候创建的吗.......修改测试启动类MyApplication.java
1 package com.zyj.application;
2
3 import com.zyj.entity.Persion;
4 import org.springframework.context.ApplicationContext;
5 import org.springframework.context.support.ClassPathXmlApplicationContext;
6
7 /**
8 * @author zyj
9 * @Package com.zyj.application
10 */
11 /*
12 * ????Sping IOC是什么时候创建的对象??
13 *在读取spring的配置文件的时候就已经创建了java对象
14 * */
15 public class MyApplication {
16 public static void main(String[] args) {
17 /**
18 * ApplicationContext是IOC容器的入口类,要获取ioc容器中的对象必须常见该类
19 * ClassPathXmlApplicationContext该类是读取spring的xml配置文件的
20 */
21 ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml");
22 //获取ioc容器中的具体对象,需要强制类型转换
23 // Persion persion = (Persion)context.getBean("persion");
24 //获取ioc容器中的对象,不需要强制类型转换
25 /*Persion persion = context.getBean("persion",Persion.class);
26 System.out.println(persion);*/
27 }
28 }
7.执行结果:

由此可看出:在读取spring的配置文件,并没有使用该对象的时候,就已经创建完成了对象。
以上~谢谢!
Spring初识及其IOC入门的更多相关文章
- Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)
Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个 ...
- 【Spring】---【IOC入门案例】
第一步:导入Jar包 第二步:创建类,在类里面创建方法 public class User { public void add(){ System.out.println("-------- ...
- 1、Spring简介及IOC入门案例
一.Spring框架介绍 1.介绍 Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务 ...
- Spring.Net的IOC入门
1.构造器注入 namespace Spring.Net { class Program { //构造器注入 static void Main(string[] args) { IApplicatio ...
- Spring框架的IOC核心功能快速入门
2. 步骤一:下载Spring框架的开发包 * 官网:http://spring.io/ * 下载地址:http://repo.springsource.org/libs-release-local/ ...
- Spring入门1. IoC入门实例
Spring入门1. IoC入门实例 Reference:Java EE轻量级解决方案——S2SH 前言: 之前学习过关于Spring的一点知识,曾经因为配置出现问题,而总是被迫放弃学习这些框架技术, ...
- Spring 核心概念以及入门教程
初始Spring 在学习Spring之前我们首先要了解一下企业级应用.企业级应用是指那些为商业组织,大型企业而创建并部署的解决方案及应用. 这些大型企业级应用的结构复杂,涉及的外部资源众多,事务密集, ...
- Spring MVC 教程,快速入门,深入分析
http://elf8848.iteye.com/blog/875830/ Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: ...
- Spring学习之Ioc控制反转(1)
开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...
随机推荐
- linux 关闭对端口的监听
netstat -anp | grep [端口号] [root@test-01 ~]# netstat -anp | grep 6665 tcp 0 0 0.0.0.0:6665 0.0.0.0:* ...
- 使用python进行接口自动化测试,批量执行测试用例
工作中,使用python的requests库进行接口自动化测试是一个比较不错的选择,今天就以某网站的免费接口为例,展示以get请求进行批量执行测试用例.话不多说直接开讲 分析一下接口信息, 请求地址: ...
- LightOJ-1074(SPFA判负圈+Bellman-Ford算法)
Extended Traffic LightOJ-1074 这题因为涉及到减法和三次方,所以可能会出现负圈. 这里使用的算法叫做SPFA算法,这个可以用来判负圈和求解最短路.Bellman-Ford算 ...
- a标签不能继承父级的颜色
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- iot漏洞mips汇编基础
1 基础概念 MIPS(Microprocessor without Interlocked Piped Stages architecture),是一种采取精简指令集(RISC)的处理架构,由MIP ...
- mysql数据库的数据备份,以及开启日志
导出数据: location代表需要保存的数据文件的位置,默认保存在 C:\ProgramData\MySQL\MySQL Server 5.7\Data(Windows10系统位置,其他系统位置自行 ...
- 2019 GDUT Rating Contest I : Problem C. Mooyo Mooyo
题面: C. Mooyo Mooyo Input file: standard input Output file: standard output Time limit: 1 second Memory ...
- go beego框架与python实现数据交互
目标:将go中一个二维数组传到pythone中处理并返回.难点在于数据格式的转换. go代码如下: package main import ( "os/exec" "sy ...
- Bug调试专项训练四笔记
Ajax案例一 导入项目直接运行出现联想无反应 错误原因: 错误1: 55行找不到方法: 错误1解决方案: 解决错误1点击仍无反应 错误2:通过浏览器得出错误2:58行找不到方法 错误2解决方案: 解 ...
- POJ3278_Catch That Cow(JAVA语言)
思路:bfs裸题.三个选择:向左一个单位,向右一个单位,向右到2*x //注意,需要特判n是否大于k,大于k时只能向左,输出n-k.第一次提交没注意,结果RE了,, Catch That Cow Ti ...