Spring学习笔记①
我觉得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学习笔记①的更多相关文章
- 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- spring学习笔记(一) Spring概述
博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书. 强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...
- Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)
在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...
- Spring学习笔记2——表单数据验证、文件上传
在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...
- 不错的Spring学习笔记(转)
Spring学习笔记(1)----简单的实例 --------------------------------- 首先需要准备Spring包,可从官方网站上下载. 下载解压后,必须的两个包是s ...
- 【Spring学习笔记-MVC-15.1】Spring MVC之异常处理=404界面
作者:ssslinppp 异常处理请参考前篇博客:<[Spring学习笔记-MVC-15]Spring MVC之异常处理>http://www.cnblogs.com/sssl ...
- 【Spring学习笔记-MVC-13.2】Spring MVC之多文件上传
作者:ssslinppp 1. 摘要 前篇文章讲解了单文件上传<[Spring学习笔记-MVC-13]Spring MVC之文件上传>http://www.cnblogs.co ...
- 【Spring学习笔记-MVC-9】SpringMVC数据格式化之日期转换@DateTimeFormat
作者:ssslinppp 1. 摘要 本文主要讲解Spring mvc数据格式化的具体步骤: 并讲解前台日期格式如何转换为java对象: 在之前的文章<[Spring学习笔记-MVC ...
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...
- 【Spring学习笔记-MVC-4】SpringMVC返回Json数据-方式2
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
随机推荐
- phpcms 杂乱总结
1.根据catid 获取 栏目名称 $CATEGORYS = getcache('category_content_'.$siteid,'commons'); $name = {$CATEGORYS[ ...
- Oracle job调用存储过程
在PL/SQL中的what值中直接写入存储过程的名称+“分号”: begin sys.dbms_job.submit(job => :job, what => 'del_ky_items; ...
- jQ小图标上下滑动特效
嗯,又到了,夜静饥寒的时候,手指颤抖,回望去,屋内满是寂静,寥寥绰影,咳咳咳,想我程序员之路还没到终点...就...咳咳咳 好了日常神经结束,还要涂我的唇膏.还剩下,最后一章,js动画(四),明天放上 ...
- [源代码] SailingEase .NET Resources Tool (.NET 多语言资源编辑器)
我在2016年10月发过一篇博客,介绍了我写过的一个多语言资源文件编辑器,并且做为免费软件发布给了出来. 陆续收到了一些朋友的反馈,有朋友很热心提了很多建议和关心的话,还有朋友发红包过来,让我很感动. ...
- 如何给 UILable 添加横线
类似淘宝上的原价现价,原价上一般都会有一条横线,这种效果怎么实现呢?其实相当的简单,我们只需要重写自定义的lable的 - (void)drawRect:(CGRect)rect 方法就行了. 具体实 ...
- 未来手机Alo即将问世!全息投影手机的新高峰!全息3d 网
文章来源:网络 编辑:大熊 [摘要]全息投影手机很早就开始炒,网络上的概念机也是丛出不穷,那么这款出自法国的概念机又是多么的奇葩?全息 3d 网带你一探究竟. 据外媒报道,在不久将来语 ...
- 背景图height:100%显示
这段时间,写移动端页面,总是遇到背景图在不同的设备上的显示拉伸问题: 本来想写百分比,可是并没有显示,又不想media@ ,换一种思路用img写 群友提供了一个办 html,body{height:1 ...
- PHP文本处理之中文汉字字符串转换为数组
在PHP中我们可以通过str_split 将字符串转换为数组,但是却对中文无效,下面记录一下个人将中文字符串转换为数组的方法. 用到的PHP函数 mb_strlen - 获取字符串的长度 mb_sub ...
- PHP编码规范实例
<?php /** * 符合psr-1,2的编程实例 * * @author 作者 描述 */ namespace Standard; // 顶部命名空间 / ...
- linux系统盘使用率达到100%的问题查找和解决方法
今天公司云服务器报警系统发来短信,系统磁盘空间不够,登录服务器进行查看,磁盘使用虑达到100%, 感觉比较奇怪,所存的东西并不多,怎么会将磁盘占满,而且数据都是存在数据盘下,通过简单的进行 ...