我的Spring学习记录(一)
spring是一个框架,一个我理解为对象的大熔炉,它生产着各种bean,还可以对生产的对象进行加工。
这里有些概念需要理解一下,就是IOC和DI以及AOP,接下来,我们进入主题。
spring简介
上图是官方直接copy下来的,主要是说明了各个组件的应用情况,在博客中的项目主要是应用了spring的核心容器部分。
简介这个概念性的东西我们可以先看下百度百科的解释,因为我觉得我还不是很够格,而且我的表述能力一直是诟病
还有就是上面说到的几个概念性的东西,我们一 一看来:
- IOC,我们把它翻译为控制反转,我当时也是很晕,这是什么鬼,一番解释就是将我们新建对象的能力控制能力反转给了spring容器
- DI ,依赖注入,这主要就是将容器中的对象通过一定的方法注入到我们需要的使用这个对象地方,一般是通过类中的setter方法将属性的值进行注入,我把DI看成是IOC的具体实现方式之一
- AOP 面向切面编程,好像很高大上的样子,貌似面向对象都不是很能说出个道道,怎么就面向切面了,其实面向切面我的理解是将各个类中零散的,但是又是必须的,不能直接抽取出来的代码进行抽取,这些抽取的东西相当于一个切面,一个简单的切面的例子就是我们web中的filter,如下图
这里的各个servlet如果没有filter就需要自己去过滤编码问题了,但是,filter的出现解决了代码的重复,这我理解为抽取,把一些相同的,零碎的重复代码进行抽取,放入一个东西里面统一处理,这就是切面
最后我给出一些关于以上概念性的东西的链接,自己参考一下,以免我的个人局限耽误了你
http://www.yiibai.com/spring/spring_overview.html
https://www.zhihu.com/question/25392984?sort=created
http://blog.csdn.net/mdcmy/article/details/8542277
http://www.cnblogs.com/lonelydreamer/p/6197024.html
https://martinfowler.com/articles/injection.html
使用spring构建一个对象
首先需要构建一个项目,这里我使用了maven构建,需要在pom.xml中添加如下依赖
<properties>
<spring.version>4.3.10.RELEASE</spring.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
如果不使用maven就需要自己拷贝jar包了
这里有一个简单的bean,代码如下:
public class Dog {
private String name;
private String breed;
private String sex;
//get和set方法请自己加上去
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", breed='" + breed + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
我们先看一下如果是没有使用spring直接new一个bean是怎么样的
/**
* 一般的类的创建--new
*/
@Test
public void test01(){
Dog dog = new Dog();//这里使用new关键字
dog.setSex("公");
dog.setName("旺旺");
dog.setBreed("土狗");
System.out.println(dog);
}
//打印结果:Dog{name='旺旺', breed='土狗', sex='公'}
但是使用spring获取一个bean的话首先你需要配置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 name="dog" class="cn.lger.domain.Dog"/>
</beans>
然后需要通过bean工厂加载xml配置文件,获取信息,这里我们使用的是ClassPathXmlApplicationContext来获取bean的信息它是BeanFactory的子类,能够读取classpath下的一个或者多个xml,包括jar包里面的
/**
* 通过ClassPathXmlApplicationContext获取bean-->dog
*/
@Test
public void test02(){
//新建一个ClassPathXmlApplicationContext类型对象,并且加载xml文件
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//通过bean的类型加载一个Dog类型对象
Dog dog = applicationContext.getBean(Dog.class);
//打印测试
System.out.println(dog);
}
//打印结果:Dog{name='null', breed='null', sex='null'}
上面两个都弄出了dog对象,只是下面的对象的属性值都为null,现在我们改一下xml文件
<!--声明一个bean并且指定相应的类-->
<bean name="dog" class="cn.lger.domain.Dog">
<property name="name" value="小美"/>
<property name="breed" value="土狗"/>
<property name="sex" value="母"/>
</bean>
现在重新运行上面的test02方法打印的结果就是Dog{name='小美', breed='土狗', sex='母'}了,是不是很神奇。
但是,可能有一个问题就是new出来的不是更加简单吗,为什么还要通过这么复杂的配置等等等来获取一个bean呢。刚开始我也在疑问,不过,这个还是在使用的过程中慢慢体验吧。
到了这里就已经通过spring获取了一个bean,已经是基本的入门了spring
关于这篇博客
这两篇博客实在我学习了spring之后写的,隔的时间有好些天了,因为近期有点时间,所以创作这篇博客,想要分享一下学习的东西。还有就是自己在一些已经看过的东西、概念中还是比较模糊的,一些都已经忘了,没有经常练习的原因,所以,这也是算作笔记,这样的话,忘了一些东西从新起步可能会比较快一点
小提示:有些人一直跟我说看官方文档是最好的,因为这样可以掌握核心科技:-) So,
https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#overview
哦,听说你不喜欢看英文的?
https://www.gitbook.com/book/waylau/spring-framework-4-reference/details
我的Spring学习记录(一)的更多相关文章
- 我的Spring学习记录(二)
本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...
- 我的Spring学习记录(四)
虽然Spring管理这我们的Bean很方便,但是,我们需要使用xml配置大量的Bean信息,告诉Spring我们要干嘛,这还是挺烦的,毕竟当我们的Bean随之增多的话,xml的各种配置会让人很头疼. ...
- 我的Spring学习记录(五)
在我的Spring学习记录(四)中使用了注解的方式对前面三篇做了总结.而这次,使用了用户登录及注册来对于本人前面四篇做一个应用案例,希望通过这个来对于我们的Spring的使用有一定的了解. 1. 程序 ...
- Spring 学习记录3 ConversionService
ConversionService与Environment的关系 通过之前的学习(Spring 学习记录2 Environment),我已经Environment主要是负责解析properties和p ...
- Spring 学习记录8 初识XmlWebApplicationContext(2)
主题 接上文Spring 学习记录7 初识XmlWebApplicationContext refresh方法 refresh方法是定义在父类AbstractApplicationContext中的. ...
- Spring 学习记录6 BeanFactory(2)
主题 除了Spring 学习记录5 BeanFactory 里写的几个接口外,BeanFactory的实现类还实现了一些其他接口,这篇文章主要介绍这些接口和实现类. 结构 DefaultListabl ...
- Spring学习记录(九)---通过工厂方法配置bean
1. 使用静态工厂方法创建Bean,用到一个工厂类 例子:一个Car类,有brand和price属性. package com.guigu.spring.factory; public class C ...
- Spring学习记录(七)---表达式语言-SpEL
SpEL---Spring Expression Language:是一个支持运行时查询和操作对象图表达式语言.使用#{...}作为定界符,为bean属性动态赋值提供了便利. ①对于普通的赋值,用Sp ...
- Spring 学习记录5 BeanFactory
主题 记录我对BeanFactor接口的简单的学习. BeanFactory我感觉就是管理bean用的容器,持有一堆的bean,你可以get各种bean.然后也提供一些bean相关的功能比如别名呀之类 ...
- Spring学习记录(十四)---JDBC基本操作
先看一些定义: 在Spring JDBC模块中,所有的类可以被分到四个单独的包:1.core即核心包,它包含了JDBC的核心功能.此包内有很多重要的类,包括:JdbcTemplate类.SimpleJ ...
随机推荐
- Tomcat修改端口
当在服务器上运行报错说端口已占用的时候,需要修改Tomcat的端口,步骤如下: 一.找到Tomcat的安装目录 二.进入conf目录,找到server.xml文件,记事本打开 此时文件中有三个地方可以 ...
- BotVS开发基础—2.7 指标MACD
代码 def main(): while true: records = _C(exchange.GetRecords); # 获取K线数据 ,默认为策略界面设置的K线周期, _C 是一个容错的内置函 ...
- 【渗透笔记】拿下某小H网的全过程
自从班上A片小王子的7个T资源被封了以后,本小白为造福全班同学,尝试拿下个小H网,先用webrobot搜某些只有小H网才会出现的关键词 本以为直接导出放御剑里跑就行了,然并软.于是用awvs扫了一下, ...
- python进阶学习(一)
同样是<python基础教程(第二版)>的内容,只是后面内容学起来,相比前面会比较有趣,也更加实用,所以,将"基础"改为"进阶". python 电 ...
- python 二进制转换
#二进制装换msg = "大家好"msg1 = msg.encode(encoding='utf-8')#转换成二进制print(msg1)msg2 = msg1.decode(' ...
- SVG基本形状及样式设置
前面的话 图形分为位图和矢量图.位图是基于颜色的描述,是由像素点组成的图像:而矢量图是基于数学矢量的描述,是由几何图元组成的图像,与分辨率无关.可缩放矢量图形,即SVG,是W3C XML的分支语言之一 ...
- C++ operator bool
雕虫小技: #include <iostream> struct A{ operator bool(){ return false; } }; int main() { A a{}; if ...
- 简单理解java中timer的schedule和scheduleAtFixedRate方法的区别
timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情况出现时会有区别--当前任务没有来得及完成下次任务又交到手上. 我们来举个例子: 暑假到了老 ...
- 自制mpls ldp实验
实验步骤 步骤1:完成EIGRP BGP 及宣告配置 步骤2:完成LDP 的配置 过程校验 步骤1:校验和理解LDP 邻居关系的发现和邻接关系的建立 R4#show mpls ldp discover ...
- JS学习二(循环)
JS中的循环结构 [循环结构的执行步骤] 1.声明循环变量: 2.判断循环条件: 3.执行循环体操作: 4.更新循环变量: 然后,循环执行2~4,知道条件不成立.跳出循环. [while 循环] wh ...