Spring_简单入门(学习笔记1)
Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
一:IoC(Inversion of Control)控制反转,将创建对象实例反转给spring,交给IoC容器
1,底层原理:工厂模式+配置文件+反射
小测试:
public class SpringDemo1 {
@Test
public void demo01(){
//普通方法实现对象
UserDao dao=new UserDaoImp();
dao.save();
}
@Test
public void demo02(){
//ioc方式实现对象
//创建Spring工厂
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过反射获取实现类
UserDao userDao = (UserDao) ac.getBean("UserDao");
userDao.save();
}
}
2,DI(依赖注入)
面向对象有:
- 依赖 a 依赖b (a中有b,比如 a中的方法有 public void save(b) )
- 继承 a is b(a继承b)
- 聚合 a has b(a聚合b)
主要就是对象(应用程序)依赖IoC容器向应用程序中注入其所需要的外部资源(对象,资源,变量)
具体可以参考这篇博文
3,Spring工厂类
- BeanFactory*(老版本模式)在调用 getBean(类ID) 方法时才会创建该类
- ApplicationContext*(现在较常用的Spring工厂类)在加载配置文件的时候就会实例化IoC容器中的类
在最底层有两个实现类: - ClassPathXmlApplicationContext("applicationContext.xml") 加载类路径下即src下的配置文件(常用)
- FileSystemXmlApplicationContext("applicationContext.xml") 加载系统文件下即磁盘下的配置文件
4,Spring的配置
bean的属性配置(了解)
- id:配置的类的名字,有唯一性约束,不能有特殊符号
- name:也是配置的类的名字,没有唯一性约束,可以有特殊符号
- class:配置的类的全路径
配置的类的生命化周期:
<bean id="UserDao" class="com.test.spring.UserDaoImp" init-method="init" destroy-method="destroy"/>
在配置的类中写 init() ,和 destroy() ,在创建类实例的时候会自动执行 init() 方法,当工厂关闭时,会执行destroy()方法(前提是默认创建的类是单例)
bean标签的作用范围配置(重点)
对scape属性的配置:
- singleton(默认值,交给IoC容器创建的类为单例)
- prototype(多例,将Action类交给IoC容器是需要设置为多例)
- request(在Web工程下,创建的类会被引入request域中)
- session(在Web工程下,创建的类会被引入到session域中)
5,Spring中属性注入
1,利用有参构造方法
public class Car {
private String name;
private double price;
public Car(String name, double price) {
super();
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Car [name=" + name + ", price=" + price + "]";
}
}
<bean id="Car" class="com.test.spring.Car">
<!-- 构造方法注入属性 -->
<constructor-arg name="name" value="马车"/>
<constructor-arg name="price" value="100000.9"/>
</bean>
2,set方法注入
public class Car1 {
private String name;
private double price;
public void setName(String name) {
this.name = name;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car1 [name=" + name + ", price=" + price + "]";
}
}
<bean id="Car1" class="com.test.spring.Car1">
<!-- set方法注入属性 -->
<property name="name" value="跑车"/>
<property name="price" value="12334"/>
</bean>
set方法设置对象类型的注入:
public class User {
private String name;
private Car car;
public void setName(String name) {
this.name = name;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "User [name=" + name + ", car=" + car + "]";
}
}
<bean id="User" class="com.test.spring.User">
<!-- 属性为类时的注入 -->
<property name="name" value="李氏"/>
<property name="car" ref="Car"/>
</bean>
2.1,p名称空间的属性注入(类中属性也需要提供set方法)
首先需要引入p名称空间
如何引入:
<!-- 利用P名称空间来注入普通属性 -->
<bean id="Car1" class="com.test.spring.Car1" p:name="马车p" p:price="300000000"/>
<!-- p名称空间方式引入对象属性 -->
<bean id="User" class="com.test.spring.User" p:name="邬八" p:car-ref="Car"/>
2.2SpEL(Spring Exception Language)可以调用其他类中的属性和方法
例子:
public class CarInfo {
private String name;
public String getName(){
return "spel马车";
}
public double priceInfo(){
return Math.random() * 5000;
}
}
<!--通过SpEL完成注入属性 -->
<bean id="Car1" class="com.test.spring.Car1">
<property name="name" value="#{CarInfo.name}"/>
<property name="price" value="#{CarInfo.priceInfo()}"/>
</bean>
<bean id="CarInfo" class="com.test.spring.CarInfo"/>
3,集合类型的属性注入(一般在整合Spring和Hibernate)时用到
public class CollectBean {
private String[] arrs;
private List<String> list;
private Set<String> set;
private Map<String,String> map;
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "CollectBean [arrs=" + Arrays.toString(arrs) + ", list=" + list + ", set=" + set + ", map=" + map + "]";
}
}
<!-- 集合类型的属性注入 -->
<bean id="CollectBean" class="com.test.spring.CollectBean">
<property name="arrs">
<list>
<value>李氏</value>
<value>王五</value>
</list>
</property>
<property name="list">
<list>
<value>大吉</value>
<value>大力</value>
</list>
</property>
<property name="set">
<set>
<value>厉害</value>
<value>不厉害</value>
</set>
</property>
<property name="map">
<map>
<entry key="1" value="11"/>
<entry key="2" value="22"/>
</map>
</property>
</bean>
二,Spring分模块开发的配置
1,引入多个配置文件
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
2,在一个配置文件中引入多个配置文件
<!-- 在src下 直接引入文件名,在包下比如 com/test/applicationContext4.xml-->
<import resource="applicationContext3.xml"/>
注意:将dao层的对象作为相应的service层中类中的属性,这样在创建一次spring工厂即可
public class CustomerServiceImp implements CustomerService {
private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
@Override
public void save(Customer customer) {
System.out.println("CustomerServiceImp执行了");
customerDao.save(customer);
}
}
<bean id="CustomerServiceImp" class="com.test.service.imp.CustomerServiceImp">
<!-- 属性注入dao实现类对象 -->
<property name="customerDao" ref="CustomerDaoImp"/>
</bean>
<bean id="CustomerDaoImp" class="com.test.dao.imp.CustomerDaoImp"></bean>
Spring_简单入门(学习笔记1)的更多相关文章
- Sass简单、快速上手_Sass快速入门学习笔记总结
Sass是世界上最成熟.稳定和强大的专业级css扩展语言 ,除了Sass是css的一种预处理器语言,类似的语言还有Less,Stylus等. 这篇文章关于Sass快速入门学习笔记. 资源网站大全 ht ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- stylus入门学习笔记
title: stylus入门学习笔记 date: 2018-09-06 17:35:28 tags: [stylus] description: 学习到 vue, 有人推荐使用 stylus 这个 ...
- dubbo入门学习笔记之入门demo(基于普通maven项目)
注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...
- 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)
[原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...
- Three入门学习笔记整理
一.官方网站:https://threejs.org 二.关于Three.js 三.开始 四.实例 基本结构 结果 五.概念 坐标系 场景 相机 灯光 3D模型 六.简单动画 七.交互控制 结束 # ...
- Hadoop入门学习笔记---part4
紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...
- Hadoop入门学习笔记---part3
2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...
- PyQt4入门学习笔记(三)
# PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...
随机推荐
- Android CTS Test failed to run to conmpletion 测试超时问题
引用“Android cts all pass 全攻略”里面的一段话: ❀ testcase timeout 测试某个testcase的时候一直出现 “........”,迟迟没有pass或者fail ...
- WPF使用AForge实现Webcam预览(二)
本文主要介绍如何让摄像头预览界面的宽高比始终在16:9. 首先我们需要修改一下上一篇随笔实现的UI界面,让Grid变成一个3*3的九宫格,预览界面位于正中间.Xaml示例代码如下: <Windo ...
- mysql8解压版安装
1.下载 下载mysql8 2.安装 ① 解压到需要安装的目录,然后新建一个my.ini(位于解压目录下,与bin目录在同一个目录下) # For advice on how to change se ...
- new和delete必须成对出现吗?【网上集合贴+个人总结】
new和delete必须成对出现吗?[网上集合贴+个人总结] 1.从内存泄露与否的角度考虑 new 和 delete不一定要成对出現.理论上是這樣的.但是从习惯上來說,new delete成對出現是一 ...
- 解码mmo游戏服务器三:大地图同步(aoi)
问题引入:aoi(area of interest).在大地图中,玩家只需要关心自己周围的对象变化,而不需要关心距离较远的对象的变化.所以大地图中的数据不需要全部广播,只要同步玩家自己视野范围的消息即 ...
- Docker环境下的前后端分离项目部署与运维(十一)Docker Swarm技术
Docker Swarm技术 docker swarm技术(之前的docker集群都是在 一个虚拟主机上的,但是如果这个主机挂掉了over了,docker技术就是多个虚拟主机形成一个集群) Swarm ...
- Hexo+NexT(三):Next主题配置详解
阅读本篇之前,假定读者已经有了Node.js的基础,如需要补充Node.js知识的,请自行百度. Hexo是在Node.js框架下的一个项目,利用Node.js提供的强大功能,完成从Markdown到 ...
- 【java自定义注解1】java自定义注解-属性
关于自定义注解,以前项目种应用的不多,最近看新项目过程中发现了挺多自定义注解相关内容,使用起来比较巧妙,于是 总结了两种方式,记录如下: 第一种:结合反射进行属性注入,代码如下: 1.定义一个注解: ...
- 【hadoop+spark】搭建spark过程
部分转载,已标红源地址,本博客为本菜搭建与爬坑记录,整理版请看: https://blog.csdn.net/the_fool_/article/details/78211166 记录: ====== ...
- (数据科学学习手札62)详解seaborn中的kdeplot、rugplot、distplot与jointplot
一.简介 seaborn是Python中基于matplotlib的具有更多可视化功能和更优美绘图风格的绘图模块,当我们想要探索单个或一对数据分布上的特征时,可以使用到seaborn中内置的若干函数对数 ...