Spring4基础 学习笔记(1) ---- Bean

文章为博主看动力节点Spring教学视频总结的笔记,作为以后查阅使用。

Spring主要作用为“解耦”

根据功能不同可以将系统中的代码分为:

主业务逻辑

系统级业务逻辑:没有具体的专业业务应用场景,为主业务提供系统级服务,例如日志、安全、事务等

Spring根据代码功能特点,将降低耦合度方式分为两类:

IoC与AOP

IoC使得主业务在相互调用过程中不用再自己维护关系,即不用再自己创建要使用的对象了。而是有Spring容器统一管理,自动“注入”。

AOP使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务混杂到主业务逻辑中了,而是由Spring容器统一完成“织入”。

Spring作为一个容器,可以管理对象的生命周期、对象和对象之间的依赖关系。可以通过配置文件,来定义对象,以及设置与其他对象的依赖关系。

IoC(Inversion of Control)

AOP(Aspect Orient Programming)

IoC:

依赖查找:JNDI

依赖注入

配置文件:applicationContext.xml(名字随意,官方建议)

applicationContext容器和BeanFactory容器区别:

前者在初始化时创建对象,后者在使用时创建

Bean的装配(创建)

默认装配方式:getBean的时候调用无参构造器(没有会出错)

动态工厂bean:

<bean id="factory" class="Dynamic_Bean_Factory.ServiceFactory"/>

<!-- someSerice对象是由对应工厂对应方法创建 -->

<bean id="someService"factory-bean="factory"factory-method="getSomeSevice"/>

对象由工厂创建但是代码里没有工厂,在配置文件里配置

ISomeService service = (ISomeService) ac.getBean("someService");

静态工厂bean:

工厂创建bean方法为static的

<!-- 由class对应工厂的对应静态方法创建的对象 -->

<bean id="someService" class="Static_Bean_Factory.ServiceFactory" factory-method="getSomeService"/>

ISomeService service = (ISomeService) ac.getBean("someService");

Bean的作用域:

1.prototype原型模式:每次getBean都会创建新的Bean,且在使用的时候才会创建

<bean id="someService" class="service.ISomeServiceImpl" scope="prototype"/>

2.singleton单例模式:每次getBean都是同一个对象,初始化applicationContext容器时候创建(默认值)

3.request:对于每次http请求都产生不同Bean

4.session:对于不同的session有不同的Bean

注:对于scope的值request、session、global session只有在Web应用中使用Spring时,才有效。

Bean后处理器:是一个特殊的Bean,容器中所有的Bean在初始化时,均会自动执行该类的两个方法。

由于该Bean由其他Bean自动调用,所以该Bean没有Id。

两个方法:参数1初始化的bean,参数2beanName和bean的id属性对应

//bean初始化完成之前

Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;

//bean初始化完成之后

Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

Bean后处理器的应用:

1.修改after方法的返回值为bean的代理对象实现增强

2.为特定的bean增强:增加Condition:判断beanName

bean的初始化前和销毁前可以调用bean的方法:

init-method="" destroy-method=""/>

其中销毁方法的执行有两个要求:

1)被销毁的对象需要是singleton

2)容器要显式地关闭

对象默认是singleton的;appplicationContext接口没有定义关闭方法,定义在实现类中,需要将applicationCnotext强转:

((ClassPathXmlApplicationContext)ac).close();

Bean的生命周期(可控点):

1.bean的无参构造器

2.属性的setter

<bean id="someService" class="lifeOfBean.ISomeServiceImpl" >

<property name="adao" value="AAA"/>

<property name="bdao" value="BBB"/>

</bean>

3.如果bean实现了beanNameAware接口:

@Override

public void setBeanName(String name) {

// TODO Auto-generated method stub

System.out.println("Step3 : beanName = " + name);

}

4.如果bean实现了BeanFactoryAware接口:

@Override

public void setBeanFactory(BeanFactory beanFactory) throws BeansException {

// TODO Auto-generated method stub

System.out.println("Step4 : 获取到beanFactroy");

}

5.bean后处理器的before方法

6.如果bean实现了InitializingBean接口:

@Override

public void afterPropertiesSet() throws Exception {

// TODO Auto-generated method stub

System.out.println("Step6 : InitializingBean接口的afterPropertiesSet方法");

}

标志着bean的初始化工作完成

7.bean配置的init-method方法:

<bean id="someService" class="lifeOfBean.ISomeServiceImpl" init-method="init_method">

8.bean后处理器的after方法

9.bean的主业务方法

10.如果bean实现了DisposableBean接口(Disposable:一次性):

@Override

public void destroy() throws Exception {

// TODO Auto-generated method stub

System.out.println("Step10 : ");

}

这个方法的执行需要对象是单例的和容器手工关闭

11.bean配置的destory-method

匿名bean:一个bean使用byType方式找查找另一个bean,另一个bean可以没有id

内部bean:将bean放在property内,id为property的name :

<bean id="stu" class="di01.Student">

<property name="">

<bean class=""></bean>

</property>

</bean>

匿名bean:一个bean使用byType方式找查找另一个bean,另一个bean可以没有id

内部bean:将bean放在property内,id为property的name :

<bean id="stu" class="di01.Student">

<property name="">

<bean class=""></bean>

</property>

</bean>

同类抽象bean:

bean可以继承另一个bean:

<bean parent="">会继承parent的class和property

用来被继承的bean没有意义,将abstract属性定义为true

异类抽象bean:

被继承的bean没有class属性,必须将abstract定义为true

如有错误,欢迎指正。

原文地址:https://www.cnblogs.com/coderlynn/p/8654153.html

时间: 2024-11-09 00:46:07

Spring4基础 学习笔记(1) ---- Bean的相关文章

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

HTML&CSS基础学习笔记13—无序列表

无序列表 有时我们的工作繁忙,杂事很多,怕忘记,就会把事情一件件列出来,防止忘记. 它们的排列顺序对于我们来说并不重要,可以随意调换,我们将它称为无序列表,HTML里用<ul>标签来表示无序列表,列表里的项目则用<li>标签来表示: 1 2 3 4 5 <ul>     <li></li>     <li></li>     ... </ul> 看一段实例代码: 对于的浏览器显示结果是这样的: 更多内容学习,请

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

JAVA基础学习笔记(2)

看了几天的视频了,都没时间来写下学习笔记,今天来写下第二次的学习笔记,前几天看的给忘记了,就写最新看到的吧 主要内容:1.类的变量与函数(方法) 2.对象的存储方式 3.新建一个对象及对象的赋值与调用 4.空对象 5.匿名对象 1.类的变量与函数(方法) class Dog      //类名 { String name;  //变量的声明 int age; String color; void bark()   //方法的定义(返回值为空,不带参数) { System.out.println(

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分

JAVA基础学习笔记(1)

今天第一天开始学JAVA,时间:2014年6月17日 学习内容:1.java环境的架设 2.JAVA基本数据类型 1.JAVA环境的架设       1.要先去下载JDK,下载地址 2.安装完成后,设置环境变量 1.1环境变量的设置        1.右键-我的电脑-属性-高级-环境变量-系统变量,找到PATH,在里面加入jdk里bin目录的地址 如:c:\java\bin; 2.新建-名为classpath,值为. 1.2测试JAVA是否配置正确        1.在cmd里面输入javac.

java基础学习笔记day01

java基础学习笔记day01 1.软件开发: 软件:按照特定顺序组织的计算机数据和指令的集合 开发:软件的制作过程 软件开发:借助开发工具和计算机语言制作软件 2.java概述: java之父:詹姆斯·高斯林 JDK:java开发环境 jre:java运行环境 JVM:java虚拟机 java跨平台是因为,JVM能在不同的平台运行,JVM是跨平台的 JavaSE:标准版 JavaME:手机端,物联网 JavaEE:企业版,互联网项目 3.java语言特点: 简单性 解释性 面向对象 高性能 分

linux基础学习笔记——操作大全

作者:liaoyi 更新时间:2014-6-2 ****************基本操作***************** 关机 shutdown -h now    root用户               init 0              root用户halt      root+一般用户poweroff 重启shutdown -r now    root用户init6     root用户reboot            root+一般用户 注意:1.shutdown 比较灵活,可

HTML&CSS基础学习笔记15-合并单元格

合并单元格 之前的文章中,我们已经能够创建一个简单地表格了,如果我们需要把横向的某两个相邻单元格<td>或者纵向的某两个相邻单元格<td>合并,我们该怎么做呢?我们要知道的知识点如下: 1.标签<td>的[colspan]属性规定单元格可横跨的列数,即横向合并的单元格数: 2.标签<td>的[rowspan] 属性规定单元格可横跨的行数,即纵向合并的单元格数: 3.这2个标签也可以同时使用. 样式示例: 现在就来试试合并单元格吧: <!DOCTYPE