引言:以下记录一些自己在使用时pringle框架时的一些自己心得合成体会时,如有侵权,请联系本博主。

1. spring基本都使用

spring是一个开源的轻量级框架,其目的是用于简化企业级应用程序开发,降低侵入性;

spring提供的IOC和AOP功能,可以将组件的耦合度降至最低,便于系统日后的维护和升级。

在spring中,任何的java类和JavaBean都被当成Bean处理,这些Bean通过容器管理和使用。

1.1 最基本的spring的使用

spring容器有BeanFactory和ApplicationContext两种类型,ApplicationContext接口继承自BeanFactory接口,拥有更多的

企业级方法,推荐使用该类型。 ClassPathXmlApplicationContext是ApplicationContext的一个实现类。

(1) spring容器实例化:创建spring的IOC容器对象

  1. @Test
  2. //测试使用无参构造器创建对象
  3. public void test1(){
  4. //启动spring容器
  5. ApplicationContext ac=new ClassPathXmlApplicationContext("config/basic.xml");
  6. //调用容器的方法来获取对象
  7. //方法的返回值类型是object,所以要强转,或者调用重载的方法(多传一个参数),
  8. //反射,这是一个class对象,告诉它返回类型.
  9. ExampleBean eb=ac.getBean("eb",ExampleBean.class);
  10. System.out.println(eb);
  11. }

说明:参数值config/basic.xml是spring配置文件的位置

(2) bean的实例化:在创建spring的IOC容器对象的时候,它会调用basic.xml中配置的bean(HelloWorld)的构造器进行初始化,

同时会调用属性的set方法对属性进行赋值();

  1. <!-- 使用无参构造器创建对象 :告诉容器你要创建哪个对象-->
  2. <!-- id 属性:bean的名称,要求唯一。
  3. class属性:bean的完整的类名(要求包含包名)。 -->
  4.  
  5. <bean id="eb" class="basic.ExampleBean"/> <!-- 这里写的是包含ExampleBean类的那个包名 -->

java类ExampleBean如下:

  1. package basic;
  2.  
  3. public class ExampleBean {
  4.  
  5. public ExampleBean() {
  6. System.out.println("ExampleBean's 无参构造");
  7.  
  8. }
  9.  
  10. }

除了使用构造器来实例化对象(主要方式),还可以使用以下两种方式来实例化对象(了解):

  1. <!-- 使用静态工厂的方法创建对象 -->
  2. <!-- factory-method属性:指定一个静态方法
  3. 注:spring容器会调用指定静态方法来创建对象 -->
  4. <bean id="cal" class="java.util.Calendar" factory-method="getInstance"/>
  5.  
  6. <!-- 使用实例工厂方法创建对象 -->
  7. <!-- factory-bean属性:某个bean的id。
  8. factory-method属性:指定一个实例方法。 -->
  9. <bean id="date1" factory-bean="cal" factory-method="getTime"/>

1.2 bean的作用域、生命周期以及延迟实例化

  1. <!-- 配置作用域 -->
  2. <!-- scope属性:默认值是singleton(单例,即容器针对一个bean的配置,只会创建一个实例)。
  3. 如果值是prototype(原型,会创建多个实例)-->
  4. <bean id="stu1" class="basic.Student" scope="prototype"/>
  5.  
  6. <!-- 配置生命周期相关的两个方法 -->
  7. <!-- init-method属性:初始化方法名
  8. destroy-method属性:销毁方法的名称,只有作用域为单例的bean,销毁方法才会执行-->
  9. <bean id="mb1" class="basic.MessageBean" init-method="init"
  10. destroy-method="destroy" /><!-- 告诉容器要销毁哪个方法 -->
  11.  
  12. <!-- 配置延迟加载 -->
  13. <!-- 默认情况下,当spring容器启动之后,会将所有作用域为当例(singleton)先创建好 -->
  14. <bean id="lz1" class="basic.LazyBean" lazy-init="true"/>
  15.  
  16. <!-- 将以上几种配置合成 -->
  17. <bean id="mb2" class="basic.MessageBean1" init-method="init"
  18. destroy-method="destroy" scope="singleton" lazy-init="false"/>
  1. @Test
  2. public void test1(){
  3. ApplicationContext ac=new ClassPathXmlApplicationContext("config/basic2.xml");
  4. Student stu1=ac.getBean("stu1",Student.class);
  5. Student stu2=ac.getBean("stu1",Student.class);
  6. //默认情况下,对于一个bean的配置,容器只会创建一个对象(即作用域为singleton).
  7. System.out.println(stu1==stu2);
  8. }
  9.  
  10. @Test
  11. //测试生命周期
  12. public void test2(){
  13. //启动spring容器
  14. //ApplicationContext这个接口没有定义关闭容器的方法,所以需要用其子接口。
  15. //AbstractApplicationContext这是ApplicationContext子接口,里面有关闭的方法。
  16. AbstractApplicationContext ac=new ClassPathXmlApplicationContext("config/basic2.xml");
  17. //通过容器获得对象
  18. MessageBean mb1=ac.getBean("mb1",MessageBean.class);
  19. //调用对象的方 法
  20. mb1.sendMsg();
  21. //首先要先关闭容器,才销毁
  22. ac.close();
  23. }
  24.  
  25. @Test
  26. //测试 延迟加载
  27. public void test3(){
  28. ApplicationContext ac=new ClassPathXmlApplicationContext("config/basic2.xml");
  29. // 默认情况下,当spring容器启动之后,会将所有作用域为当例(singleton)先创建好
  30. }
  31.  
  32. @Test
  33. //多种配置合成在一起
  34. public void test4(){
  35. AbstractApplicationContext ac=new ClassPathXmlApplicationContext("config/basic2.xml");
  36. MessageBean1 mb2=ac.getBean("mb2",MessageBean1.class);
  37. mb2.sendMsg();
  38. ac.close();
  39. }
  1. package basic;
  2.  
  3. public class Student {
  4.  
  5. public Student() {
  6. System.out.println("Student 无参构造");
  7. }
  8.  
  9. }
  10.  
  11. public class LazyBean {
  12. public LazyBean() {
  13. System.out.println("实例化:LazyBean()");
  14. }
  15. }
  16.  
  17. public class MessageBean {
  18.  
  19. public MessageBean() {
  20. System.out.println("实例化:MessageBean()");
  21. }
  22.  
  23. public void init(){
  24. System.out.println("初始化:init()");//表示获取一些资源
  25. }
  26.  
  27. public void sendMsg(){
  28. System.out.println("调用方法:sendMsg()");
  29. }
  30.  
  31. public void destroy(){
  32. System.out.println("销毁:destroy()");
  33. }
  34. }
  35. public class MessageBean1 {
  36.  
  37. public MessageBean1() {
  38. System.out.println("实例化:MessageBean1()");
  39. }
  40. public void init(){
  41. System.out.println("初始化:init()");
  42. }
  43. public void sendMsg(){
  44. System.out.println("调用方法:sendMsg()");
  45. }
  46. public void destroy(){
  47. System.out.println("销毁方法:destroy()");
  48. }
  49. }

2. IOC (Inversion of Control,控制反转)

IOC是指程序中对象的获取方式发生了反转,由最初的new方式创建,转变为由第三方框架(spring)创建,

注入(DI),它降低了对象之间的耦合度。spring容器是采用了DI方式实现方法了IOC空字符串,IOC是spring框架的基础和核心。

2.1 DI

DI:依赖注入(Dependency Injection)的基本原理就是将一起工作具有关系运算符的对象添加,通过

构造方法参数或方法参数传入建立关联,因此容器的工作就是创建bean时注入那些依赖关系。

IOC是一种思想,而DI是实现IOC的主要技术途径。

DI主要有两种注入方式:Setter注入和构造器注入。

(1) Setter注入

通过调用无参构造器或无参static工厂方法实例化bean以后,调用该bean的setter()方法,即可实现setter方式的注入.

property属性表示采用set方式注入,既然是注入,那肯定是发生在两个组件(对象)之间。

方法一:直接注入值(value)

  1. <bean id="computer" class="com.bean.Computer">
  2. <property name="mainboard" value="技嘉"/>
  3. </bean>
  1. public class Computer{
  2. private String mainboard; // 主板
  3. public String getMainboard(){
  4. return mainboard;
  5. }
  6. public void setMainboard(String mainboard){
  7. this.mainboard = mainboard;
  8. }
  9. }

方法二:引用的方式(ref),ref主要用户引用对象

  1. <!-- 告诉spring采用无参构造器的方法创建对象B对象 -->
  2. <bean id="b1" class="ioc.B"/>
  3. <bean id="c1" class="ioc.C"/>
  4.  
  5. <!-- 配置依赖注入(采用set方法) -->
  6. <!-- property属性:表示采用set方法来注入。name属性用来指定属性名(首先首字母B大写,然后在前面加set),ref属性指定属性值 -->
  7. <bean id="a1" class="ioc.A">
  8. <!-- setB -->
  9. <property name="service" ref="c1"></property>
  10. </bean>

测试set方式注入:

  1. @Test
  2. //测试set方法注入
  3. public void test5(){
  4. AbstractApplicationContext ac=new ClassPathXmlApplicationContext("config/ioc.xml");
  5. A a1=ac.getBean("a1",A.class);
  6. a1.execute();
  7. }
  1. package ioc;
  2.  
  3. import ioc.Service;
  4.  
  5. public interface Service {
  6. public void f1();
  7. }
  8.  
  9. public class B implements Service{
  10. public B(){
  11. System.out.println("B()");
  12. }
  13. public void f1(){
  14. System.out.println("B's f1()");
  15. }
  16. }
  17.  
  18. public class C implements Service{
  19. public C(){
  20. System.out.println("C()");
  21. }
  22. public void f1(){
  23. System.out.println("C's f1()");
  24. }
  25. }
  26.  
  27. public class A {
  28. private Service service;
  29. //容器调用对象提供的set方法来建立依赖关系
  30. //1.类应该提供有对应的set方法
  31. //2.在配置文件中,使用property元素来配置依赖关系
  32.  
  33. public void setService(Service service) {
  34. System.out.println("setService()");
  35. this.service = service;
  36. }
  37.  
  38. public A(){
  39. System.out.println("A()");
  40. }
  41.  
  42. public void execute(){
  43. service.f1();
  44. }
  45. }
  1. //执行结果
  2. B()
  3. C()
  4. A()
  5. setService()
  6. C's f1()

(2) 构造器注入(使用相对较少)

基于构造器的注入是通过调用带参数的构造器来实现,容器在bean被实例化的时候,根据参数类型执行相应的构造器。

构造器注入,可以强制给bean注入某些参数,比set注入更严格。

构造器的注入一般格式为:

方法一:直接注入值(value)

按构造参数索引指定注入

  1. <bean id=''phone" class="com.bean.MobilePhone">
  2.   <constructor-arg index="0"> value="ARM"/> //当然这里也可以采用ref去引用另外的bean,但是采用ref的时候主要用于引用对象
  3.   <constructor-arg index="1"> value="2G"/>
  4. </bean>
  1. public class MobilePhone{
  2.   private String cpu;
  3.   private String ram;
  4.   //构造方法
  5.   public MobilePhone(String cpu,String ram){
  6.     this.cpu = cpu;
  7.     this.ram = ram;
  8.   }
  9. }

方法二:采用引用的方式(ref)

  1. <!-- 配置依赖注入(采用构造器方式注入) -->
  2. <!-- index属性:指定参数的位置(从0开始). -->
  3. <bean id="wt1" class="ioc.Waiter" />
  4. <bean id="rest1" class="ioc.Restaurant" >
  5. <!-- 将ref传到构造方法的第一个参数上 -->
  6. <constructor-arg index="0" ref="wt1"></constructor-arg>
  7. </bean>
  1. @Test
  2. //测试构造器注入
  3. public void test6(){
  4. AbstractApplicationContext ac=new ClassPathXmlApplicationContext("config/ioc.xml");
  5. Restaurant rest1=ac.getBean("rest1",Restaurant.class);
  6. System.out.println(rest1);
  7. }
  1. package ioc;
  2.  
  3. import ioc.Waiter;
  4.  
  5. public class Waiter {
  6.  
  7. public Waiter() {
  8. System.out.println("Waiter()");
  9. }
  10.  
  11. }
  12.  
  13. public class Restaurant {
  14. private Waiter wt;
  15.  
  16. public Restaurant(){
  17. System.out.println("Restaurant()");
  18. }
  19. public Restaurant(Waiter wt) {
  20. System.out.println("Restaurant(wt)");
  21. this.wt = wt;
  22. }
  23.  
  24. @Override
  25. public String toString() {
  26. return "Restaurant [wt=" + wt + "]";
  27. }
  28.  
  29. }
  1. //执行结果
  2. Waiter()
  3. Restaurant(wt)
  4. Restaurant [wt=ioc.Waiter@5f282abb]

 2.2 自动装配

  1. <bean id="wt1" class="ioc.Waiter"/>
  2. <!-- 自动装配 :默认情况下,容器禁止自动装配。-->
  3. <!-- (1)byName:以属性名(wt)作为bean的id,查找配置文件,找到之后,会使用set方法来注入。
  4. 注: 找不到会注入null值, 不会找到多个符合条件的bean。
  5. (2)byType:以属性类型(Waiter)作为bean的类型,查找配置文件(ioc.Waiter),找到之后,会使用set方法来注入。
  6. 注:找不到会注入null值,如果找到多个符合条件的bean,会出错。
  7. (3)constructor:与byType类似,只不过会使用构造器来注入。 -->
  8. <bean id="rest" class="ioc.Restaurant" autowire="byType"/>
  1. @Test
  2. //测试自动装配
  3. public void test1(){
  4. ApplicationContext ac=new ClassPathXmlApplicationContext("ioc.xml");
  5. Restaurant rest=ac.getBean("rest",Restaurant.class );
  6. System.out.println(rest);
  7. }
  1. package ioc;
  2.  
  3. public class Restaurant {
  4. private Waiter wt;
  5. public Restaurant(){
  6. System.out.println("构造:Restaurant()");
  7. }
  8.  
  9. public void setWt(Waiter wt) {
  10. System.out.println("setWt()");
  11. this.wt = wt;
  12. }
  13.  
  14. @Override
  15. public String toString() {
  16. return "Restaurant [wt=" + wt + "]";
  17. }
  18. }
  19.  
  20. public class Waiter {
  21. public Waiter() {
  22. System.out.println("构造:Waiter()");
  23. }
  24. }

1.spring基础知识讲解的更多相关文章

  1. Spring基础知识

    Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...

  2. Html基础知识讲解

    Html基础知识讲解 <title>淄博汉企</title> </head> <body bgcolor="#66FFCC" topmar ...

  3. python基础知识讲解——@classmethod和@staticmethod的作用

    python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...

  4. java Reflection(反射)基础知识讲解

    原文链接:小ben马的java Reflection(反射)基础知识讲解 1.获取Class对象的方式 1.1)使用 "Class#forName" public static C ...

  5. spring 基础知识复习

    spring是一个分层架构,由 7 个定义良好的模块组成.Spring 模块构建在核心容器之上,核心容器定义了创建.配置和管理 bean 的方式. 组成spring框架的每个模块(或组件)都可单独存在 ...

  6. Spring 基础知识

    Spring架构简单描述 原文:https://www.shiyanlou.com/courses/document/212 Spring 概述 1. Spring 是什么 Spring是一个开源的轻 ...

  7. ElasticSearch(四):关于es的一些基础知识讲解

    上一篇博客更新完之后,我发现一个问题:在我创建索引的时候依旧无法准确的理解每个字段的意义,所以就有了这个. 1. 关于索引 1.1 关于索引的一些基础知识 在创建标准化索引的时候,我们传入的请求体如下 ...

  8. shell基础知识讲解

    第1章 shell基础 1.1 什么叫做shell编程 shell编程也叫做bash高级编程语法 1.2 常见的shell命令解释器 bash            redhat和centos使用 d ...

  9. 2015年12月10日 spring初级知识讲解(三)Spring消息之activeMQ消息队列

    基础 JMS消息 一.下载ActiveMQ并安装 地址:http://activemq.apache.org/ 最新版本:5.13.0 下载完后解压缩到本地硬盘中,解压目录中activemq-core ...

随机推荐

  1. SOAPUI 案例操作步骤

    1. 构建项目 2. 运行单个请求 3. 构建测试用例 4. 接口之间传递参数 5. 运行整个测试用例 构建测试 以天气接口为例: 接口: http://ws.webxml.com.cn/WebSer ...

  2. hiho一下 第144周

    题目1 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求: ...

  3. ES6知识整理(2)--变量的解构赋值

    最近准备在业余空闲时间里一边学习ES6,一边整理相关知识.只有整理过的学习才是有效的学习.也就是学习之后要使用和整理成文,才是真正的学到了... 上一篇是一个试水,现在接上. 变量提升 看了下朋友回复 ...

  4. linux下nginx编译安装

    步骤: 1.获取nginx安装包. 进入nginx官网:http://nginx.org/ 找到稳定版本: 点击红框内的链接. 使用wget获取安装包. wget http://nginx.org/d ...

  5. linux下SVN忽略指定文件/文件夹

    http://www.cnblogs.com/fjping0606/p/4743009.html 1.配置SVN默认编辑器vi ~/.bash_profile最后一行加上:export SVN_EDI ...

  6. scrapy 自定义图片路径保存,并存到数据库中

    scrapy中有个自带的pipeline工具,ImagesPipeline,可以专门用来储存图片到本地. 但默认储存地址无法配置,所以我们需要写一个自己的pipeline用于储存图片. 先分析一下我们 ...

  7. K8S学习笔记之Kubernetes核心概念

    0x00  Kubernetes简介 Kubernetes(K8S)是Google开源的容器集群管理系统,其设计源于Google在容器编排方面积累的丰富经验,并结合社区创新的最佳实践. K8S在Doc ...

  8. Golang操作结构体、Map转化为JSON

    结构体生成Json package main import ( "encoding/json" "fmt" ) type IT struct { Company ...

  9. 框架frame

    使用框架切分网页 效果: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...

  10. udp丢包 处理

    转自: 自己在做UDP传输时遇到的问题,接收端没设置缓存,结果总是丢包. 看到这篇文章设置了一下接收缓存就好 *;//设置为32K setsockopt(s,SOL_SOCKET,SO_RCVBUF, ...