我觉得Spring之所以发展的好,主要是理论研究与实践是并轨的,能跟得上时代的步伐,尤其是基础理论的研究(可能是最近看三体看多了,对基础理论非常崇拜)。微服务的实现啊,RESTful的实现,对应的SpringMVC,SpringBoot,etc,Spring一直在刷新自己,反观Struts2,一个又一个的漏洞报出来...

Spring里面的核心名词有几个:IoC,DI和AOP。

  • Ioc,inverse of Control,控制反转,这个很好理解,就是要使用一个类中的方法,你需要new出来,然后用对象去调用,这是传统的方法。那Spring接管了这部分的功能,你不需要自己去new一个对象,这也是解耦的一个做法。
  • DI,是MF大神提出来的,依赖注入,其实也很好理解,就是向类里面的属性设置值。
  • AOP,不是很好理解,至今没太懂,看视频说是添加或修改功能不需要修改源代码就叫AOP,等后面理解了在详细说。

1、理解IoC原理

IoC的底层原理:XML+dom4j+工厂模式+反射

XML用来配置需要被反转控制的类:

<bean id="userService" class="tech.youngs.UserService" />

我们需要定义一个工厂类,去解析这个XML文件,创建工厂类实际上就是为了write once use everywhere:

public class UserFactory{
public static UserService getService()
{
String className = "XML中class的属性值";//通过dom4j获取
//然后利用反射来获取这个类
Class clazz = Class.forName(className);
//创建实例
UserService userService = clazz.newInstance();
return userService;
}
}

因为上面定义的方法是static的,所以在使用时可以直接调用:

public class UserServlet{
UserService userService = UserFactory.getService();
void fun()
{
userService.add();
} }

这样多的好处是极大的降低了耦合,当user的类发生变化时候,只需要修改XML配置文件中的class属性值,非常方便。

当然,上面的IoC底层实现原理我觉得很简单,Spring已经帮我们封装了上面的代码,比上面还要简单。

2.实战IoC

在实战前需要配置Spring,导入Jar包,那么Spring提供了特别多的包,官网上有一张图:

这张图里面Core Container部分,只需要导入这里面的Jar就行了。beans、context、core、SpEL(叫做表达式,在jar包中用 expression表示)

也就是上面的这些是Spring的IoC基本功能核心包。

除了Spring的核心包,还需要导入支持日志的jar包,log4j和commons。

下面来写一个例子,实际上,Spring 的IoC 的名词叫Bean管理器,就是管理项目中的POJO类的一个东西:

首先需要创建Spring的配置文件,官方建议的xml文件命名为applicationContext,路径最好放在src下,这样好找。Spring没有规定必须要放在哪里命名是什么。

<?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 id="user" class="tech.youngs.ioc.User"></bean>
</beans>

这段代码

<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">

被称为约束,schema。这是一个root标签,所以需要有</beans>,我们需要让Spring管理的POJO类的定义都在这里面写:

<bean id="user" class="tech.youngs.ioc.User"></bean> 

这就是一个需要管理的bean标签,定义了class路径,id标识符。

这时候Spring就可以来控制这个POJO类的生成过程了:

首先需要在生成POJO的类中引入配置文件:

//加载Spring配置代码
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

然后根据id来寻找对应的类就可以返回POJO实例:

User user = (User)context.getBean("user");
user.add();

非常简单。

3、Bean管理器

上面的管理bean的方法叫做无参构造创建方法,还有静态工厂创建方法和实例工厂创建方法,在项目中很少使用,其实也很简单,用到了查一下。

bean标签常用参数

配置文件中的bean标签除了id、class还有两个非常重要的属性name/scope:下面就详解这四个参数:

id           bean的标识符,不能有特殊符号,一般命名为类的名字,首字母小写

class      创建对象的类的全路径

name     基本不用了,name的作用和id一致,与id不同的是name可以包含特殊符号

scope    有※singleton【单例】 ※prototype【多例】×request ×session ×globeSession取值 后面三个基本不用

详细的说一下scope:

singleton是scope的默认值,表示对象是一个单例对象,不管取多少次对象,它都是返回唯一一个对象

User user1 = (User)context.getBean("user");
User user2 = (User)context.getBean("user");
user1和user2的地址是一样的

prototype便是对象是个多实例对象,与singleton相反,一般用在管理Struts的Action。

/*下面的基本不用*/

request、session、globalSession把创建的对象放在request、session、globalSession域里面。

globalSession类似于单点登录的时候使用 也很像application 但是开发的时候会用redis实现单点登录

4、属性注入

定义:在创建某个类的对象的时候,注入(设置)类内属性的值。

方式:①【最常用】set方法注入 ② 含参构造方法注入③【不常用】接口注入,在接口中定义设值方法。

Spring只支持第一种和第二种方法,最多的是第一种方式。

先用含参构造方法写一下:

定义了一个类,里面有两个属性:

package tech.youngs.property;

public class PropertyDemo1 {
private String username;
private String address; public PropertyDemo1(String username,String address) {
super();
this.username = username;
this.address = address;
}
public void test1()
{
System.out.println("demo1 username:"+username);
System.out.println("demo1 address:"+address);
}
}

在配置文件中,bean的内部使用constructor-arg标签,按照类中属性的顺序,注入属性的值。

<!-- 属性注入 -->
<bean id="propertyDemo1" class="tech.youngs.property.PropertyDemo1">
<!-- 有参构造注入 -->
<constructor-arg value="Xianyanga"></constructor-arg>
<constructor-arg value="Xianyang"></constructor-arg>
</bean>

需要注意得是,myeclipse给我说constructor-arg里面不能有name的属性了,所以只能是这样来,更简单了。

我们在用set方式定义,这是最常用的方法:

定义一个类,然后sourse出setter方法就行了

主要是配置文件,在bean中使用property标签,包含name和value,name是属性名,value是需要注入的值

<!-- 属性注入 -->
<bean id="demo2" class="tech.youngs.property.Demo2">
<!-- set属性注入 -->
<property name="username" value="youngs"></property>
<property name="address" value="xianyang111"></property>
</bean>

在项目的开发中,很少会有注入字符串的时候,经常注入其他的对象,这是一个重点!

注入对象类型的属性

<!-- 注入类的属性 -->
<bean id="userDao" class="tech.youngs.ioc.UserDao"></bean>
<bean id="userService" class="tech.youngs.ioc.UserService">
<!-- set属性注入 -->
<property name="userdao" ref="userDao"></property>
</bean>

和普通注入字符串不同的是,使用ref去引用已经被bean管理器管理(声明了<bean>)的POJO类。这个非常常用。

※5、IoC和DI的区别

DI是不能脱离IoC而存在的,是在IoC的基础之上,完成依赖注入。

Spring学习笔记①的更多相关文章

  1. 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

  2. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  3. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

  4. Spring学习笔记2——表单数据验证、文件上传

    在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...

  5. 不错的Spring学习笔记(转)

    Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是s ...

  6. 【Spring学习笔记-MVC-15.1】Spring MVC之异常处理=404界面

    作者:ssslinppp       异常处理请参考前篇博客:<[Spring学习笔记-MVC-15]Spring MVC之异常处理>http://www.cnblogs.com/sssl ...

  7. 【Spring学习笔记-MVC-13.2】Spring MVC之多文件上传

    作者:ssslinppp       1. 摘要 前篇文章讲解了单文件上传<[Spring学习笔记-MVC-13]Spring MVC之文件上传>http://www.cnblogs.co ...

  8. 【Spring学习笔记-MVC-9】SpringMVC数据格式化之日期转换@DateTimeFormat

    作者:ssslinppp       1. 摘要 本文主要讲解Spring mvc数据格式化的具体步骤: 并讲解前台日期格式如何转换为java对象: 在之前的文章<[Spring学习笔记-MVC ...

  9. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

  10. 【Spring学习笔记-MVC-4】SpringMVC返回Json数据-方式2

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

随机推荐

  1. Struts2 属性驱动、模型驱动、异常机制

    模型驱动使用单独的VO(值对象)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果. 一.使用模型驱动 1.login.action采用模型驱动模式实现,采用模型驱动时必 ...

  2. 企业为什么要实行ERP系统,它到底有什么好处呢?

    目前,我国正在大力推行企业信息化建设,作为一种包含了现代管理思想的ERP(Enterprise Resource Planning)系统日益成为现代企业业务运作的主要工具,为了提升管理水平,提升企业竞 ...

  3. Unity游戏开发——自动为动画剪辑添加事件 之 最后几帧的事件不能被调用的问题

    最近在做一个根据配置表自动生成动画剪辑clip以及controller的功能.做法是根据配置表配置的动作以及每个动作的关键帧,自动为每个clip添加事件.这样做可以把动画的事件处理在游戏运行之前就计算 ...

  4. 【bzoj4198】 Noi2015—荷马史诗

    http://www.lydsy.com/JudgeOnline/problem.php?id=4198 (题目链接) 题意 一篇文章n个单词,每个出现了${w_i}$次,用k进制数代替单词,使得任意 ...

  5. POJ2479(dp)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39089   Accepted: 12221 Des ...

  6. linux命令行模式下对FTP服务器进行文件上传下载

    参考源:点击这里查看   1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码 ...

  7. iOS视频压缩处理

    最近忙于项目开发, 昨天才完成整个项目的开发, 今天就抽出时间, 分享一下我在开发中所涉及到的技术问题! 由于近期开发涉及到视频, 所以视频压缩, 上传, 播放等一系列功能都是要涉及到的, 所以在此, ...

  8. 微服务框架概览之 Netty

    Netty 是什么 Netty 提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序 Netty 架构图 为什么选择Netty 通过对Netty的分析,我 ...

  9. Linux 6.4 partprobe出现warning问题

    今天在给服务器做LVM的时候(服务器的系统是CentOS 6.3),用fdisk分区之后,用w写入分区表的时候,就提示Command (m for help): wThe partition tabl ...

  10. CentOS下WDCP下的MYSQL开启远程连接

    1.首先要在防火墙开启3306端口访问 2.然后做如下操作 如何开启MySQL的远程帐号-1)首先以 root 帐户登陆 MySQL 在 Windows 主机中点击开始菜单,运行,输入"cm ...