Spring框架的基础使用

XML配置信息,Bean的不同实例化方式,注入

实例化

XML文件中的参数设置

1、通过构造器进行实例化(重点,常用方式)

 <bean name="aClss2" class="com.stu.bean.AClass"></bean>

  id:指定bean的名称,用于在spring中查找这个bean对象,除了id属性,也可以使用name属性来作为名称

    注意:

    (1)在同一个Spring容器中不能有id,name或id和name两两相同的bean定义

    (2)id属性比name属性更严格,因此绝大多数时候使用id属性

  class:指定bean的类型,用于从spring容器中查找这个bean对象

     根据class对应的类型来从容器中获取对象
     如果在bean定义中有多个定义对应的类型都能匹配,则发生异常

    抽象类和接口不能被实例化 通过该方式实例化

2、通过静态工厂方法进行实例化

 <bean id="cal" class="java.util.Calendar" factory-method="getInstance"></bean>

  id:指定bean的名称
  class:指定工厂类型
  factory-method:用于指定工厂中创建bean对象的工厂方法,必须用static修饰

3、通过实例工厂方法进行实例化

  <!-- 1.创建实例工厂 -->
<bean id="ggncal" class="java.util.GregorianCalendar"></bean>
  <!-- 2.指定实例工厂并调用其中的实例工厂方法来获取对象 -->
<bean id="date" factory-bean="ggncal" factory-method="getTime"></bean>

4.JavaBean的作用域 scope属性

  scope="prototype":多例的

  scope="singleton":单例的(默认)

Bean的生命周期

  1. bean的定义 (xml文件、注解、java代码)
  2. bean的初始化
    init-method="  "  当bean在被初始化的时候,会被调用的方法

    (1)如果是singleton的bean,则在容器创建时就会初始化单例bean ,初始化方法只会被调用一次
    (2)对于prototype的bean,则在要获取该bean的对象时进行初始化, 初始化方法在每次获取对象时都会被调用

  3. bean的调用
    容器对象中的getBean()方法进行调用
  4. bean的销毁
    销毁方法是在web环境下,停止服务时调用或通过销毁容器对象时调用
    注意:对于singleton的bean,其生命周期完全有Spring容器控制,对于prototype则不完全是。

    ps:
    对于初始化方法和销毁方法吗,可以在beans节点中配置 default-init-method、default-destroy-method 来指定容器中每个bean的默认初始化方法,
    如果在单独的bean中也配置了它自己的初始化方法和销毁方法,则以bean节点中单独配置的那个为准

  5. 延迟实例化

    在ApplicationContext实现的默认行为就是在容器启动时将所有的singleton bean提前进行实例化
    如果不想让一个singleton bean在ApplicationContext初始化时就提前实例化,可以使用bean元素的lazy-init属性进行改变
    对于一个延迟实例化的bean,将在第一次调用时进行实例化

    lazy-init="true" 延迟加载

A.通过构造器实例化和静态工厂实例化

先构建用来测试的两个实体类 AClass.java 和 BClass.java

AClass.Java

import java.io.Serializable;

/**
* 文件名称: com.stu.bean.AClass.java<br/>
* 初始作者: Administrator<br/>
* 创建日期: 2018-2-1<br/>
* 功能说明: 例子用到的第一个类 <br/>
* =================================================<br/>
* 修改记录:<br/>
* 修改作者 日期 修改内容<br/>
* ================================================<br/>
* Copyright (c) 2010-2011 .All rights reserved.<br/>
*/
public class AClass implements Serializable { private static final long serialVersionUID = 6558544854955394381L;
/** 类的名称 **/
private String name;
/** 类开头的字母 **/
private String index; public AClass() { } public AClass(String name, String index) { this.name = name;
this.index = index;
} public String getName() { return name;
} public void setName(String name) { this.name = name;
} public String getIndex() { return index;
} public void setIndex(String index) { this.index = index;
} public void init() { System.out.println("在AClass中定义的初始化时调用的方法init...");
} public void destroy() { System.out.println("在AClass中定义的销毁时调用的方法destroy...");
} @Override
public String toString() { return "AClass [index=" + index + ", name=" + name + "]";
} }

BClass.java

import java.io.Serializable;

/**
* 文件名称: com.stu.bean.BClass.java<br/>
* 初始作者: Administrator<br/>
* 创建日期: 2018-2-1<br/>
* 功能说明:例子用到的第二个类 <br/>
* =================================================<br/>
* 修改记录:<br/>
* 修改作者 日期 修改内容<br/>
* ================================================<br/>
* Copyright (c) 2010-2011 .All rights reserved.<br/>
*/
public class BClass implements Serializable { private static final long serialVersionUID = 7680390121166235795L; private String name;
private int age;
/** 引入一个AClass参数,用来测试注入操作 **/
private AClass aClass; public BClass() { } public BClass(String name, int age, AClass aClass) { super();
this.name = name;
this.age = age;
this.aClass = aClass;
} public AClass getaClass() { return aClass;
} public void setaClass(AClass aClass) { this.aClass = aClass;
} public String getName() { return name;
} public void setName(String name) { this.name = name;
} public int getAge() { return age;
} public void setAge(int age) { this.age = age;
} @Override
public String toString() { return "BClass [aClass=" + aClass + ", age=" + age + ", name=" + name + "]";
} }

通过构造器进行实例化:applicationContext.xml

    <!--
id:例子在bean中的名字,值不可重复
class:例子类的类型,在底层个,通过反射原理进行实例化。
scope:作用域范围,'singleton'为单例;'prototype'不为单例;
init-method:初始方法名称,自定义。
destroy-method:销毁执行的方法名称。
lazy-init:懒加载
-->
<!-- 接口和静态类无法通过Spring添加 -->
<bean id="aClass" class="com.stu.bean.AClass" scope="singleton"
init-method="init" destroy-method="destroy" lazy-init="default"></bean> <!-- 使用name声明 -->
<bean name="aClss2" class="com.stu.bean.AClass"></bean> <!--
实例化静态方法 ,以Calendar为例 ,Java中初始化为:new Calendar().getInstance();
factory-method:用于指定工厂中创建bean对象的工厂方法,必须是static修饰
-->
<bean id="cal" class="java.util.Calendar" factory-method="getInstance"></bean> <!-- 1.创建实例工厂 -->
<bean id="ggncal" class="java.util.GregorianCalendar"></bean>
<!-- 2.指定实例工厂并调用其中的实例工厂方法来获取对象 -->
<bean id="date" factory-bean="ggncal" factory-method="getTime"></bean>

Demo02.java

public static void main(String[] args) {

        ApplicationContext ac = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
// getBean中传入xml中的id属性
//aClass作用范围是单例的,所以内存地址是一致的
System.out.println(ac.getBean("aClass"));
System.out.println(ac.getBean("aClass", AClass.class)); // 实例静态类
System.out.println(ac.getBean("cal", GregorianCalendar.class)); //实例工厂
System.out.println(ac.getBean("date",Date.class));
}

运行结果:

在AClass中定义的初始化时调用的方法init...
AClass [index=null, name=null]
AClass [index=null, name=null]
java.util.GregorianCalendar[time=1517484929359,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=1,WEEK_OF_YEAR=5,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=32,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=35,SECOND=29,MILLISECOND=359,ZONE_OFFSET=28800000,DST_OFFSET=0]

B.依赖注入(DI)

IOC:控制反转(Inversion of control),原本由Java代码创建类的实例的权利交给了Spring容器进行创建,原本有Java代码维护的对象之间的依赖关系交给Spring容器进行维护
IOC能够降低软件模块或组件之间的耦合度

DI:依赖注入(Dependency Injection),DI的原理就是将一起工作的具有关系的对象,通过构造方法参数或方法参数传入,建立关系,因此,容器的工作就是创建bean时注入那些依赖关系,DI是IOC一种体现。

(setter注入,构造器注入,自动装配)

applicationContext.xml 中添加

    <!-- setter注入 -->
<bean id="bClass" class="com.stu.bean.BClass">
<!--
property:表示JavaBean中要被注入的属性 name:属性名 value:属性值(简单类型的属性值)
ref:属性值(关联的JavaBean类型的id)
-->
<property name="name" value="This is BClass"></property>
<property name="age" value="1"></property>
</bean> <!-- 对BClass中的AClass类型属性赋值 -->
<bean id="a2" class="com.stu.bean.AClass">
<property name="name" value="This is a2"></property>
<property name="index" value="A"></property>
</bean>
<bean id="b2" class="com.stu.bean.BClass">
<property name="name" value="This is b2"></property>
<property name="age" value="1"></property>
<!-- 使用ref传值 -->
<property name="aClass" ref="a2"></property>
</bean> <!-- 通过构造器注入 -->
<!-- 通过构造函数实例化
index:参数位置
value:参数的值
-->
<bean id="b3" class="com.stu.bean.BClass">
<constructor-arg index="0" value="This is b3"></constructor-arg>
<constructor-arg index="1" value="1"></constructor-arg>
<constructor-arg index="2" ref="a3"></constructor-arg>
</bean>
<bean id="a3" class="com.stu.bean.AClass">
<constructor-arg index="0" value="this is a3"></constructor-arg>
<constructor-arg index="1" value="1"></constructor-arg>
</bean> <!-- 自动注入 -->
<!--
autowire="byName" : 属性名=Bean Id autowire="byType" :
如果有多个相同类型的bean都能匹配成功吗,则出现错误
-->
<bean id="a4" class="com.stu.bean.AClass" autowire="byName">
<property name="name" value="this is a4"></property>
<property name="index" value="A"></property>
</bean>

Demo03.java

    public static void main(String[] args) {

        ApplicationContext ac = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
// 没有实现对AClass的属性赋值
System.out.println(ac.getBean("bClass")); // 对AClass属性赋值
System.out.println(ac.getBean("b2", BClass.class)); /**
* 使用构造注入
*/
System.out.println(ac.getBean("b3", BClass.class)); /**
* 自动注入
*/
System.out.println(ac.getBean("a4"));
}

运行结果

在AClass中定义的初始化时调用的方法init...
BClass [aClass=null, age=1, name=This is BClass]
BClass [aClass=AClass [index=A, name=This is a2], age=1, name=This is b2]
BClass [aClass=AClass [index=1, name=this is a3], age=1, name=This is b3]
AClass [index=A, name=this is a4]

[Spring]初识Spring-Spring的基础使用-如何通过Bean来实例化?的更多相关文章

  1. Spring中Bean的实例化

                                    Spring中Bean的实例化 在介绍Bean的三种实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果 ...

  2. 菜鸟学习Spring——初识Spring

    一.概念. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Develop ...

  3. Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM

    写在前面的话   承接前文<Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven>,本篇所讲述的是如何使用maven与原ssm项目整合,使得一个普 ...

  4. Spring+SpringMVC+MyBatis+easyUI整合基础篇(八)mysql中文查询bug修复

    写在前面的话 在测试搜索时出现的问题,mysql通过中文查询条件搜索不出数据,但是英文和数字可以搜索到记录,中文无返回记录.本文就是写一下发现问题的过程及解决方法.此bug在第一个项目中点这里还存在, ...

  5. Spring+SpringMVC+MyBatis+easyUI整合基础篇(十一)SVN服务器进阶

    日常啰嗦 上一篇文章<Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建>简单的讲了一下SVN服务器的搭建,并没有详细的介绍配置文件及一些复杂的功能, ...

  6. Spring+SpringMVC+MyBatis+easyUI整合基础篇(十二)阶段总结

    不知不觉,已经到了基础篇的收尾阶段了,看着前面的十几篇文章,真的有点不敢相信,自己竟然真的坚持了下来,虽然过程中也有过懒散和焦虑,不过结果还是自己所希望的,克服了很多的问题,将自己的作品展现出来,也发 ...

  7. Spring+SpringMVC+MyBatis+easyUI整合基础篇

    基础篇 Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简介 Spring+SpringMVC+MyBatis+easyUI整合基础篇(二)牛刀小试 Spring+S ...

  8. spring学习总结(一)_Ioc基础(下)

    本篇文章继续上篇文章讲解Ioc基础,这篇文章主要介绍零配置实现ioc,现在相信大家项目中也基本都是没有了xml配置文件.废话不多说.一起学习 代码示例 BookDao.java package com ...

  9. spring学习总结(一)_Ioc基础(上)

    最近经历了许许多多的事情,学习荒废了很久.自己的目标成了摆设.现在要奋起直追了.最近发现了张果的博客.应该是一个教师.看了他写的spring系列的博客,写的不错.于是本文的内容参考自他的博客,当然都是 ...

随机推荐

  1. VS Code插件

    VS Code下载地址: https://code.visualstudio.com/ 1.view in browser   和  Open-In-Browser  安装可在编辑器中打开html,在 ...

  2. DRF之视图和router

    1. 视图 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 1.1. 请求与响应 1.1.1 Request RES ...

  3. python-day1笔记

    # 1.编程语言的作用及与操作系统和硬件的关系:#编程语言就是人与电脑之间沟通的介质. # 2.应用程序->操作系统->硬件:#应用程序通过操作系统来控制计算机硬件. #3. cpu-&g ...

  4. 剑指offer-调整数组内奇偶数顺序

    题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 解题思路 时间换 ...

  5. MSMQ 事务性消息处理

    二.事务性消息处理 事务我想大家对这个词应该都不会陌生,在操作数据库的时候经常都会用到事务,确保操作成功,要么全部完成(成功) ,要么全部不完成(失败).在MSMQ中利用事务性处理,可以确保事务中的消 ...

  6. 原生JS的地区二级联动,很好理解的逻辑

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. Leetcode 1008. 先序遍历构造二叉树

    1008. 先序遍历构造二叉树  显示英文描述 我的提交返回竞赛   用户通过次数169 用户尝试次数183 通过次数171 提交次数247 题目难度Medium 返回与给定先序遍历 preorder ...

  8. SQLServer 2008以上误操作数据库恢复方法—日志尾部备份

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...

  9. 利用ML&AI判定未知恶意程序——里面提到ssl恶意加密流检测使用N个payload CNN + 字节分布包长等特征综合判定

    利用ML&AI判定未知恶意程序 导语:0x01.前言 在上一篇ML&AI如何在云态势感知产品中落地中介绍了,为什么我们要预测未知恶意程序,传统的安全产品已经无法满足现有的安全态势.那么 ...

  10. Cppcheck - A tool for static C/C++ code analysis

    cppcheck是一个个检测源码的工具,对编译工具的一个补充,mark Cppcheck - A tool for static C/C++ code analysis Syntax: cppchec ...