一,简介

spring是一个开源框架

是一个非常强大的容器框架,分离项目组件之间的依赖关系,由spring容器管理整个项目的资源和配置;

通常我们可以称spring是容器大管家(项目大管家)

功能:

  (1)  控制反转(IOC)

  (2)AOP变成的支持

  (3)事务的事务

  (4)依赖注入(DI)

  (5)对其他web框架的支持(struts2,hibernate.......)

二,控制反转(IOC)

IOC:inversion of control

  spring的核心,对于spring框架来说,就是由spring来控制对象的生命周期和对象间的关系;

  所有的类都会在spring容器中登记,告诉spring你是一个什么东西,你需要什么东西,然后spring 在系统运行到合适的时候,把你需要的东西主动给你,同时也把你提供给需要你的东西;

所有类的创建,销毁都由spring来控制,也就是说控制对象的生命周期不再是由引用它的对象,而是spring;

  对于某个具体的对象而言,以前是他控制器他对象,而现在是所有的对象都被spring控制,所以称之为控制反转;

三,依赖注入(DI)

  IOC的一个重点是系统在运行时,动态的向某个对象提供它所需要的其他对象,这点是通过DI(Dependency Injectioin ,依赖注入)来实现的;

  比如对象A需要操作数据库,以前我们可能就是在A中自己编写代码提供一个Connection对象,有了spring之后,我们只需要告诉spring,A需要一个Connection对象,

至于这个Connection对象到底如何来的,A需要知道;在系统运行到某个时候,spring就会给A提供Connection对象,像打针一样,把Connection对象注入到A中,依赖注入的名称

就是这样来的;

  那么DI底层实现是通过什么技术?反射

四,IOC和DI

  IOC是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机由我们自己把控,而现在这种权利转移给spring框架

  DI其实是IOC的另一种说法,控制的什么被反转了?就是获取对象的方式被反转了

  IOC设计模式,DI是IOC设计模式的一种实现;(ORM hibernate)

五,下载

https://repo.spring.io/libs-release-local/org/springframework/spring/

六、spring入门

1、jar包

需要额外导入lombok.jar

2、User类

@Data
public class User {
private String name;
private int age;
}

3、src新建beans.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"> </beans>

4、在beans.xml中配置bean实例

<!-- 声明bean实例,相当于是一个对象,id:唯一标识,class:类全名 -->
<bean id="user1" class="com.yujun.po.User">
<!-- 类中的属性 name:属性名 value:属性值 -->
<property name="name" value="小明"></property>
<property name="age" value="20"></property>
</bean>

5、测试

public class Demo1 {

    public static void main(String[] args) {
//通过beans.xml配置文件,创建应用上下文对象,可以当做是spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//通过配置文件中bean的id得到bean对象
User user1 = (User) context.getBean("user1");
System.out.println(user1);
} }

使用上述代码运行,会抛出下面截图中异常,原因是缺少一个commons-logging-xx.jar

请自行在项目中导入commons-logging-xx.jar

如果使用maven构建项目,请添加下面的依赖

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope>
</dependency>

6、构造方法赋值

(1)需要给User中提供一个带参数的构造方法

public User(String name, int age) {
super();
this.name = name;
this.age = age;
}

也是用使用lombok中的@AllargsControctor也可以

(2)在beans.xml中配置

<bean id="user2" class="com.yujun.maven.po.User">
<!-- 通过构造方法给属性赋值 index:构造方法中参数的下标 value:参数值 -->
<constructor-arg index="0" value="小红"></constructor-arg>
<constructor-arg index="1" value="21"></constructor-arg>
</bean>

七、依赖注入案例

我们这里以员工和部门为例,员工属于某个部门,在spring中,怎么把某个部分注入给员工?

1、实体类

@Data
public class Dept {
private int id;
private String name;
}
@Data
public class Emp {
private int id;
private String name;
private Dept dept;
}

2、beans.xml

<bean id="dept1" class="com.yujun.maven.po.Dept">
<property name="id" value="1"></property>
<property name="name" value="开发部"></property>
</bean> <bean id="emp1" class="com.yujun.maven.po.Emp">
<property name="id" value="100"></property>
<property name="name" value="小黑"></property>
<!-- ref:表示引用spring容器中存在bean的id,也就是依赖注入 -->
<property name="dept" ref="dept1"></property>
</bean>

3、测试

Emp emp1 = (Emp) context.getBean("emp1");
System.out.println(emp1);

八、注入方式

在刚才我们使用ref属性,指定bean的id,这种方式就是默认的,当让也是常用,也是推荐的一种方式;

下面我们介绍其他的注入方式;

1、autowire=”default”

此方式就是默认的配置,也是推荐大家使用的方式;也就是需要我们在bean的property节点中通过ref属性来指定依赖的bean的id

2、autowire=”byName”

此方式通过名称注入,必须让bean的id和类中属性名一样

3、autowire=”byType”

此方式通过类型注入,和依赖的bean的id没有关系,但是需要保证类型的bean在spring容器中只有一个,否则抛异常

4、小结

注入方式,通常默认配置,需要我们手动使用ref属性指定bean的id

九、bean的作用域

bean被spring容器管理后,可以通过scope属性来指定作用域,也就是bean的作用的范围;

通常取值:singletion、prototype、request、session,我们主要介绍前两个

1、scope=”singletion”

这是默认值,表示单例,也就是bean在spring容器中只有一个对象实例

2、scope=”prototype”

此方式表示多例,bean在spring容器中会产生N个对象实例

在后面讲解spring+struts2时,需要把struts2的action的此属性设置多例

十、注入集合数据

1、实体类

@Data
public class ListBean {
private List<String> list;
private Set<String> set;
private Map<String,Integer> map;
}

2、beans.xml

<bean id="list1" class="com.yujun.maven.po.ListBean">
<property name="list">
<list>
<value>小明</value>
<value>小红</value>
<value>小黑</value>
</list>
</property> <property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property> <property name="map">
<map>
<entry key="a1" value="10"></entry>
<entry key="a2" value="20"></entry>
</map>
</property>
</bean>

3、测试

ListBean list = (ListBean) context.getBean("list1");
System.out.println(list);

十一、其他配置

在bean标签中添加设置下列属性

1、lazy-init=”true”

配置当前bean是否懒加载,默认是false

2、init-method=”方法名”

bean被实例化后执行的初始化方法

3、destroy-method=”方法名”

bean被销毁后执行的销毁方法

spring-第一章-基本用法的更多相关文章

  1. spring第一章

    spring第一章 一.概述 Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的 ...

  2. struts2第一章-基本用法

    一.struts简介 1.回顾 MVC M-model模型层 V-view 视图层  前端界面 C-controller 控制层 struts2: Apache提供的开源的控制层框架,相当于servl ...

  3. 第一章 第一个spring boot程序(转载)

    第一章 第一个spring boot程序 本编博客转发自:http://www.cnblogs.com/java-zhao/p/5324185.html   环境: jdk:1.8.0_73 mave ...

  4. 【第一章】 第一个spring boot程序

    环境: jdk:1.8.0_73 maven:3.3.9 spring-boot:1.2.5.RELEASE(在pom.xml中指定了) 注意:关于spring-boot的支持, 最少使用jdk7(j ...

  5. 第一章 第一个spring boot程序

    环境: jdk:1.8.0_73 maven:3.3.9 spring-boot:1.2.5.RELEASE(在pom.xml中指定了) 注意:关于spring-boot的支持, 最少使用jdk7(j ...

  6. Spring实战第一章学习笔记

    Spring实战第一章学习笔记 Java开发的简化 为了降低Java开发的复杂性,Spring采取了以下四种策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面 ...

  7. 第一章 spring核心概念

    一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被 ...

  8. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  9. 《Spring 5官方文档》 Spring AOP的经典用法

    原文链接 在本附录中,我们会讨论一些初级的Spring AOP接口,以及在Spring 1.2应用中所使用的AOP支持. 对于新的应用,我们推荐使用 Spring AOP 2.0来支持,在AOP章节有 ...

  10. Spring 定时器Quartz的用法

    Spring定时器Quartz的用法也很简单,需要引入quartz-all-1.5.2.jar java代码如下: package com.coalmine.desktop; import java. ...

随机推荐

  1. Kaggle-房价预测

    完整代码见kaggle kernel 或 Github 比赛页面:https://www.kaggle.com/c/house-prices-advanced-regression-technique ...

  2. BIZ中model.getSql源码分析

    功能:根据model.xml文件中配置的sql,获取对应的动态sql结果. 实例代码:String sql1 = model.getSql(dao.dbMeta());String sql2 = mo ...

  3. BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)

    题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...

  4. WD与地图 解题报告

    WD与地图 哎,我好傻啊,看了题解还弄错了一遍,靠着lbw指点才董 题意:给一个带点权有向图,要求支持删边,查询一个scc前\(k\)大权值,修改点权,不强制在线. 显然倒序处理变成加边 考虑求出每条 ...

  5. [Windows Hyper-V-Server]Enable or disable firewall rules under powershell / powershell下启用禁用防火墙规则

    http://www.cryer.co.uk/brian/windows/hyper-v-server/help_computer_cannot_be_managed.htm Enable COM+ ...

  6. loadrunner断言多结果返回

    有这么一个场景,接口返回的多个状态都是正常的,那么在压测的时候,断言就需要多 init里面执行登录,根据返回获取到tokenId action中,执行登录后的操作,获取响应返回的状态,把正确的状态个数 ...

  7. LeetCode--11_974_Subarray_Sums_Divisible_by_K

    题目链接:点击这里 public static int subarraysDivByK(int[] A, int K) { int ans = 0,sum = 0; int[] B = new int ...

  8. vue-cli 项目踩坑 npm install 时出错

    1.报错如下: 2.此时你执行npm run dev  / npm run build 会报错如下 npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! v ...

  9. CMakeList.txt(3): 一个cmake实例

    介绍一个比较实用的例子,即包含生成静态库又包含引入外部头文件和链接库的cmake demo. 先按照工程规范建立工程目录,并编写代码,以下面的工程目录为例进行解释这个例子,工程的目录结构为: 1. 编 ...

  10. Windows下U盘管理程序

    一个操作系统的作业,生成的程序需要使用管理员权限运行,参考了很多网上的代码,如果打开错误,请修改字符集为使用多字节字符集,并且调整为release模式. 作业的内容如下: 任务操作系统API应用体验与 ...