1.Spring作用:

1.生态体系庞大,全能型选手!【springmvc是其一个子模块,jdbcTemplate能直接操作数据库!】

2.将其他组件粘合在一起

3.IOC容器和AOP[Aspect Oreinted Programming]:
Spring的Ioc[Inverse of Controller]机制(控制反转和依赖注入)正是用在此处。
Spring的Ioc(控制反转和依赖注入)
控制反转[Ioc]:就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。
控制反转是一种思想,其具体实现就是依赖注入!
依赖注入[DI:Dependency Injection]:组件之间的依赖关系由容器在运行期决定,由容器动态的将某种依赖关系注入到组件之中。

2.IOC容器细节

1.使用IOC容器创建对象
2.使用IOC容器在创建对象的同时,给对象的属性赋值
3.在创建对象的过程中,实现组件对象之间的自动装配

3.搭建Spring IOC容器需要的开发环境

1.导入IOC容器需要的jar包
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
commons-logging-1.1.3.jar    https://pan.baidu.com/s/1pKQznR1

2.创建Spring配置文件[Spring bean Configuration File]

4.配置bean实验

1.

 <!-- class指定类对象的全类名,交给服务器创建一个对象,id是唯一标识,在IOC只能出现一个id值为book01的对象 --><bean id="book01" class="com.neuedu.spring.entity.Book"><property name="name" value="1984"></property><property name="author" value="乔治奥威尔"></property><property name="price" value="35.0"></property></bean>

使用JUtil进行测试,首先在类中创建函数

private ApplicationContext IOC = new ClassPathXmlApplicationContext("applicationContext.xml");@Testpublic void Test() {}

类中获取有两种方式

     /** 1.通过ID获取bean* */Object bean = IOC.getBean("book02");System.out.println(bean);/** 2.通过类类名获取bean,当有多个相同类的bean时会报错* */Book bean1 = IOC.getBean(Book.class);System.out.println(bean1.getName()+":"+bean1.getAuthor());

2.获取bean的级联属性

 <!--给bean的级联属性赋值 --><bean id="stuDao" class="com.neuedu.spring.entity.StudentDao"></bean><bean id="stuService" class="com.neuedu.spring.entity.StudentService"><property name="dao" ref="stuDao"></property></bean> <bean id="stuController" class="com.neuedu.spring.entity.StudentController"><property name="service" ref="stuService"></property><property name="service.dao.username" value="testMan"></property></bean>
     /** 获取bean的级联属性* */Object bean2 = IOC.getBean("stuController");System.out.println(bean2);StudentController bean2_2 = IOC.getBean(StudentController.class);System.out.println(bean2_2.getService().getDao().getUsername());

3.通过p名称空间复制的bean

 <!-- 通过p名称空间为bean赋值 --><bean id="book03" class="com.neuedu.spring.entity.Book" p:name="白夜行"p:author="东野圭吾"p:price="51.0"p:cbs="燕山大学出版社"/>
     /** 获取通过p名称空间赋值的bean* */Object bean3 = IOC.getBean("book03");System.out.println(bean3);

4.

 <!-- 测试bean的作用域,分别创建单实例和多实例 测试bean的创建时机   --><bean id="student01" scope="singleton" class="com.neuedu.spring.entity.Student"></bean><bean id="teacher01" scope="prototype" class="com.neuedu.spring.entity.Teacher"></bean>
     /** 测试bean的作用域,分别创建单实例和多实例* 测试bean的创建时机  * */Object bean4 = IOC.getBean("teacher01");Object bean4_2 = IOC.getBean("teacher01");

scope为singleton的单实例bean在注入IOC容器时就已创建,scope为prototype的多实例bean在获取时创建

5.

 <!-- 创建带有生命周期方法的bean --><bean id="student02" scope="singleton" class="com.neuedu.spring.entity.Student" init-method="init" destroy-method="destroy"></bean>
/** 创建带有生命周期方法的bean对象* */ConfigurableApplicationContext cac=(ConfigurableApplicationContext) IOC;Object bean = IOC.getBean("student02");cac.close();

6.

<!-- bean之间的依赖关系 --><bean id="student03" class="com.neuedu.spring.entity.Student" depends-on="teacher03"></bean><bean id="teacher03" class="com.neuedu.spring.entity.Teacher"></bean>

若不设置依赖关系,则按顺序创建bean,若设置了depends-on,则遇到student03的创建时,先创建teacher03

7.

<!-- 通过继承实现bean之间的配置信息重用 --><bean id="student04" class="com.neuedu.spring.entity.Student"><property name="name" value="st4"></property><property name="grade" value="2"></property><property name="address" value="天津"></property></bean><bean id="student05" class="com.neuedu.spring.entity.Student" parent="student04"><property name="name" value="st5"></property></bean>

8.

<!-- 通过abstract创建一个模板bean --><bean id="book04" class="com.neuedu.spring.entity.Book" abstract="true"><property name="name" value="我是猫"></property><property name="author" value="夏目漱石"></property><property name="price" value="15.2"></property><property name="cbs" value="京都出版社"></property></bean><bean id="book05" class="com.neuedu.spring.entity.Book" parent="book04"><property name="name" value="虞美人草"></property></bean>

abstract的bean不能被获取

9.

 <!-- 测试使用NULL值 --><!-- NULL值等价于不设定value值, 基本数据类型不可使用NULL值 --><bean id="book06" class="com.neuedu.spring.entity.Book"><property name="name" value="我是猫"></property><property name="author"><null></null></property><property name="price" value="0.0"></property><property name="cbs" value="京都出版社"></property></bean>

10.

<!-- 引用外部bean --><bean id="bookShop01" class="com.neuedu.spring.entity.BookShop"><property name="name" value="城市之光"></property><property name="book" ref="book06"></property></bean>

11.

<!-- 引用内部bean --><bean id="bookShop02" class="com.neuedu.spring.entity.BookShop"><property name="name" value="城市之光"></property><property name="book"><bean class="com.neuedu.spring.entity.Book"><property name="name" value="我是猫"></property><property name="author" value="夏目漱石"></property><property name="price" value="15.2"></property><property name="cbs" value="京都出版社"></property></bean></property></bean>

12.

<!-- 使用List类型的集合属性 --><bean id="bookShop03" class="com.neuedu.spring.entity.BookShop"><property name="name" value="城市之光"></property><property name="book"><bean class="com.neuedu.spring.entity.Book"><property name="name" value="我是猫"></property><property name="author" value="夏目漱石"></property><property name="price" value="15.2"></property><property name="cbs" value="京都出版社"></property></bean></property><property name="bookList"><list><ref bean="book01"/><ref bean="book02"/><ref bean="book03"/></list></property></bean>
     /** 测试List类型的集合属性* */BookShop bean10 = (BookShop)IOC.getBean("bookShop03");List<Book> bookList = bean10.getBookList();for(Book book:bookList) {System.out.println(book);          }

13.

 <!-- 使用Map类型的集合属性 --><bean id="bookShop04" class="com.neuedu.spring.entity.BookShop"><property name="name" value="城市之光"></property><property name="bookMap"><map><entry><key><value>book01</value></key><ref bean="book01"/></entry><entry><key><value>book02</value></key><ref bean="book02"/></entry><entry><key><value>book03</value></key><ref bean="book03"/></entry></map></property>       </bean>
     /** 测试Map类型的集合属性* */BookShop bean11 = (BookShop)IOC.getBean("bookShop04");Map<String, Book> bookMap = bean11.getBookMap();Set<Entry<String,Book>> entrySet = bookMap.entrySet();for (Entry<String, Book> entry : entrySet) {System.out.println(entry);}

14.

<!-- 使用prop子元素为Properties类型的属性值赋值 --><bean id="bookShop05" class="com.neuedu.spring.entity.BookShop"><property name="name" value="城市之光"></property><property name="p"><props><prop key="book01">value1</prop><prop key="book02">value2</prop><prop key="book03">value3</prop></props></property>     </bean>
     /** 测试properties类型* */BookShop bean11 = (BookShop)IOC.getBean("bookShop05");Properties p = bean11.getP();System.out.println(p);
5.通过工厂创建bean

1.静态工厂

调用静态工厂方法创建bean是将对象创建的过程封装到静态方法中。当客户端需要对象时,只需要简单地调用静态方法,而不用关心创建对象的细节。

声明通过静态方法创建的bean需要在bean的class属性里指定静态工厂类的全类名,同时在factory-method属性里指定工厂方法的名称。最后使用<constrctor-arg>元素为该方法传递方法参数。

*Book为一个{String bookName,String author,double price}的对象

import java.util.HashMap;
import java.util.Map;/** 所谓的静态工厂实例 是指:工厂类本身不用创建对象,而是通过其提供的静态方法来获取一个对象* 创建对象:*      1.往内存中【JVM】加载类的字节码文件*       2.根据类的字节码文件创建一个对象* */
public class staticFactory {private static Map<String, Book> bookList=null;static {bookList=new HashMap<String, Book>();bookList.put("book01", new Book("人间失格", "太宰治", 25.0));bookList.put("book02", new Book("嫌疑人X的献身", "东野圭吾", 15.6));bookList.put("book03", new Book("罗生门", "芥川龙之介", 18.1));}public static Book getBookByID(String id) {return bookList.get(id);     }
}
 <!-- 配置静态工厂 --><bean id="staticFactory" class="com.neuedu.factory.staticFactory" factory-method="getBookByID"><constructor-arg value="book01"></constructor-arg></bean>

2.实例工厂

实例工厂方法:将对象的创建过程封装到另外一个对象实例的方法里。当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。

实现方式

①配置工厂类实例的bean

②在factory-method属性里指定该工厂方法的名称

③使用construtor-arg 元素为工厂方法传递方法参数

import java.util.HashMap;
import java.util.Map;
/** 实例工厂先创建一个工厂对象,然后在通过工厂对象的方法获取一个实例!* */
public class instanceFactory {private Map<String, Book> bookList=null;{bookList=new HashMap<String, Book>();bookList.put("book01", new Book("人间失格", "太宰治", 25.0));bookList.put("book02", new Book("嫌疑人X的献身", "东野圭吾", 15.6));bookList.put("book03", new Book("罗生门", "芥川龙之介", 18.1));}    public Book getBookByID(String id) {return bookList.get(id);        }
}
 <!-- 配置实例工厂 --><bean id="instanceFactory" class="com.neuedu.factory.instanceFactory"/><bean id="bookFromInstanceFactory" factory-bean="instanceFactory" factory-method="getBookByID"><constructor-arg value="book01"></constructor-arg></bean>

3.FactroyBean

Spring中有两种类型的bean,一种是普通bean,另一种是工厂bean,即FactoryBean。

工厂bean跟普通bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂bean的getObject方法所返回的对象。

工厂bean必须实现org.springframework.beans.factory.FactoryBean接口。

public class factoryBean implements FactoryBean<Book>{@Overridepublic Book getObject() throws Exception {// Spring的IOC容器就是通过调用的该方法返回对象的return new Book("罗生门", "芥川龙之介", 18.1);}@Overridepublic Class<?> getObjectType() {// TODO Auto-generated method stubreturn Book.class;}@Overridepublic boolean isSingleton() {// TODO Auto-generated method stubreturn true;}}
 <!-- 配置工厂bean --><bean id="factoryBean" class="com.neuedu.factory.factoryBean"></bean>
6.bean的后置处理器

1.在bean的初始化方法调用前后执行操作的专门的对象
2.自定义后置处理器实现该接口:org.springframework.beans.factory.config.BeanPostProcessor
3.在springmvc中配置一下该bean对象.

实现BeanPostProcessor

/** 需要实现BeanPostProcessor接口,在bean初始化前后进行调用* */
public class postProcess implements BeanPostProcessor{/** 参数列表:*         1.Object  bean对象*       2.String  bean的name* */@Overridepublic Object postProcessAfterInitialization(Object objectName, String beanID) throws BeansException {// 在bean初始化之后进行调用System.out.println("postProcessAfterInitialization:"+objectName+"-"+beanID);return objectName;}@Overridepublic Object postProcessBeforeInitialization(Object objectName, String beanID) throws BeansException {// 在bean初始化之前进行调用System.out.println("postProcessBeforeInitialization:"+objectName+"-"+beanID);return objectName;}}

在javaBean中加入init方法,并在bean的配置中添加init-method

测试可得,postProcessBeforeInitialization和postProcessAfterInitialization分别在init方法也就是bean初始化的前后,若没有bean则不会有postProcessAfterInitialization方法的执行

JAVA互联网架构之Spring学习其一配置bean及工厂相关推荐

  1. spring学习--bean--普通bean与工厂bean(FactoryBean)区别

    转载:https://blog.csdn.net/weixin_45496190/article/details/107067200 1.Spring 有两种类型 bean,一种普通 bean,另外一 ...

  2. 《JAVA互联网架构:二期》架构师精品视频课程(免费不加密)

    <JAVA互联网架构:二期>架构师精品视频课程 跟着真正的互联网应用架构师,学习互联网应用架构师方向开发!可能你还为工作不好.薪资待遇不高感到烦恼,可能你还在纠结自己的技术水平不够找不到高 ...

  3. Java互联网架构 百度云_java互联网架构师

    资源内容: java互联网架构师|____014_互联网架构视频第二期(017).rar|____013_互联网架构视频第二期(016).rar|____012_互联网架构视频第二期(015).rar ...

  4. java达内项目_达内IT学院举办Java互联网架构师项目峰会

    12月19日,由达内IT学院主办的"Java互联网架构师项目峰会"在北京成功举办.本次活动是在达内IT学院成立.Java互联网架构课程全面升级之后的首场全国性的项目峰会.活动现场, ...

  5. 互联网架构,究竟为什么需要配置中心?

    互联网架构,究竟为什么需要配置中心? 原创作者: 58沈剑 来自公众号:架构师之路 配置中心是互联网架构体系中很重要的一块,但为什么会有配置中心,是不是一开始就要有配置中心,它究竟解决什么问题,这是今 ...

  6. 送给 Java 程序员的 Spring 学习指南

    https://www.infoq.cn/article/Ad-8ghcGGCNU572U6oEX 学习 Spring 的基础要求 Spring 官网首页是这么介绍自己的--"Spring: ...

  7. 阿里云ACP企业级互联网架构ACP实验之本地配置EDAS开发环境

    精选30+云产品,助力企业轻松上云!>>> 实验概述 企业级分布式应用服务(Enterprise Distributed Application Service, 简称 EDAS)是 ...

  8. 一箭双雕 刷完阿里P8架构师spring学习笔记+源码剖析,涨薪8K

    关于Spring的叙述: 我之前死磕spring的时候,刷各种资料看的我是一头雾水的,后面从阿里的P8架构师那里拿到这两份资料,从源码到案例详细的讲述了spring的各个细节,是我学Spring的启蒙 ...

  9. Spring入门第一课:Spring基础与配置Bean

    1.入门 Spring是简化java开发的一个框架,其中IoC和AOP是Spring的两个重要核心.由于Spring是非侵入性的,通过Ioc容器来管理bean的生命周期,还整合了许多其他的优秀框架,所 ...

最新文章

  1. Altium Desgner软件,PCB设计中铺铜的作用
  2. 干货|针对单个网站的渗透思路(精)
  3. 数据结构 - 最小堆最大堆
  4. P3185-[HNOI2007]分裂游戏【SG函数】
  5. Struts2框架中s:if标签和s:set标签小结
  6. .net 任务调度 mysql_C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件...
  7. 父元素没有高度,子元素高度失效
  8. apache 中 ServerAlias多个域名绑定同一空间(网站)
  9. Matlab数字孪生
  10. 最新的Scrum中文指南及更新
  11. Servlet技术详解
  12. [POJ2796]Feel Good
  13. 04_部署 etcd 集群
  14. WordPress后台友情链接的追加
  15. Android-NDK 接入Fmod库,变声操作
  16. 区别大盘点:信息学竞赛、信息学奥赛、NOIP、NOI和IOI傻傻分不清楚
  17. LXDE vs XFCE:哪个是更好的轻量级桌面环境?
  18. ikuai路由管理系统教程
  19. 单域安全评估以及加固方案
  20. MySQl 实现 FULL JOIN

热门文章

  1. Servlet实现一个网站计数器
  2. python实现数字签名2
  3. 使用T-SQL语句操作数据表-查询数据
  4. AI打拐,国内首次采用AI识别技术,找寻失踪10年儿童
  5. Shadows 使用说明
  6. java将日期格式转大写_java方法转换大写日期及人民币大写转换方式 .txt
  7. 图像处理(C++ CImage class)学习笔记
  8. Day228229.上传查询医院接口、上传查询删除科室接口、上传查询删除排班接口 -尚医通
  9. PHP 用QueryList抓取网页内容
  10. 0731-并查集-HDU2473