在上两篇的博文中,分别对spring框架中的两个很重要的概念DI(Dependency Injection)和AOP(Aspect-Oriented programming)做了介绍,或许不那么完美,但那也是我对这两个概念的理解,然后我这几天我发现有的东西还是要用一下才能真正的理解,所以接下来我们来介绍一个怎么去使用DI,后面也会谈到AOP,慢慢来。

1.在谈到怎么去装配Bean之前,我觉得有必要明白两个概念,一个是Container,还有一个就是ApplicationContext。

(1)container:翻译过来的意思就是容器,看起来好像很简单,但是在spring中他到底扮演的是什么角色呢?

container的作用其实就是负责去管理对象的生命周期,比如对象的created,wiring,还有live(活动周期)。

(2)ApplicationContext:翻译过来就是应用的上下文。说到底他到底有什么用呢?

我觉得这个理解起来会有点费劲,其实可以简单的理解为一个container的操作工具。就是操作container里面的对象的,也即是一个个Bean。或者这样说,理解也难,那么我们先看看他的前身吧(大概的说为前身)BeanFactory,正如字面上看到的先直译过来就是Bean工厂,而ApplicationContext就是从他的基础上扩展过来的,这样会不会更好的理解呢?BeanFactory为我们提供了基本的DI(依赖注入)的可能性保障。前期大家可以看看下面这图来记:

2.每一个Bean的生命周期

我觉得这个部分的内容还是很重要,在这里我就不展开来讲了,因为边幅比较长,讲起来也很难明白,最好就是看看spring中关于Bean的源码。现在可以初略的看做怎么去读取XML文档里面的数据,然后利用java的反射机制来调用类的方法吧。

3.进入正题,怎么去装配Bean,或者说定义一个Bean呢?

方式有两种,也可以说有三种:

(1)基于注解的方式,注解也分为java-based configuration 和 spring本身提供的注解

(2)基于Xml的方式,就是写进xml文件里面去

4.在怎么去定义一个bean之前我觉得有必要明白怎么去获取我们所定义的bean。

我要说的其实本质就是怎么去获取一个ApplicationContext对象,如下:

ApplicationContext ctx = new ....................-------------见下面:

(1)基于java-based configuration的(注解的,以后基于注解的我都说成是注解)(常用)

ApplicationContext ctx =  new AnnotationConfigApplicationContext();---------括号传入我们所定义的class类,多个可以用数组的方式

(2)基于注解的Web形式

ApplicationContext ctx= new AnnotationConfigWebApplication();------------括号传入我们所定义的class类,多个可以用数组的方式

(3)基于Xml的,该xml文件位于我们的classpath(常用)

ApplicationContext ctx = new ClassPathXMLApplicationContext();----------传入我们所写的xml文件,要注意的是路径位于classpath

(4)基于xml的,该xml文件位于我们的文件系统,或者说是操作系统中的盘

ApplicationContext ctx = new FileSystemXmlApplicationContext();-----------------传入我们所写的xml文件,要注意的是路径位于文件系统

(5)基于xml,该文件是通过Web来获取到的

ApplicationContext ctx = new XMLWebApplicationContext();-----------------传入我们所写的xml文件,要注意的是路径web

5.知道了怎么去获取,我们就开始去Wiring bean吧。

(1)先说基于注解的(因为我觉得注解的是大势所趋,spring boot就是很好的例子,配置xml太繁琐,后面也会谈到)

首先先说一下,我们要用到的注解有:

@Configuration ---------------声明该类为配置类

@Componnet   ----------------声明该类为一个组件类,我觉得这个还是记他的英文比较好

@ComponentScan ----------声明要扫描的地方

@Bean --------------------------声明一个Bean

@Autowired -------------------自动装配Bean

了解了我们要用到的注解,那么我们通过一个简单的例子来说明一下:

(2)导入spring的jar包,(ps:博主使用的是4.3的)---------------这部分请自己导入

(3)创建一个Say Hello的接口:

package com.yqy.CSDN.Spring;public interface SayHello {void sayHello();}

(4)创建接口的实现类:

package com.yqy.CSDN.Spring;import org.springframework.stereotype.Component;
@Component
public class SayHelloWorld implements SayHello{@Overridepublic void sayHello() {System.out.println("Say Hello World");}}

(5)用注解的方式实现定义一个Bean

package com.yqy.CSDN.Spring;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan(basePackageClasses={SayHelloWorld.class})
public class BeanConfig {@Beanpublic SayHello getSayHelloWorld(){return new SayHelloWorld();}}

(6)测试一下:

package com.yqy.CSDN.Spring;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class BeanConfigTest {@Testpublic void test() {ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanConfig.class);SayHello s = (SayHello) ctx.getBean("getSayHelloWorld");s.sayHello();}}

结果如下:

Say Hello World

这样我们就定义好一个Bean 了,对比xml的方式是不是很简单呢?这里需要注意的一点就是@Bean如果你没有指定名的话,它的ID默认的就是方法的名。

6.我们看看XML是怎么实现同样的功能的把:

(1)配置xml文件:applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<pre name="code" class="java">
<span> <context:component-scan base-package="test"></context:component-scan></span>

<bean id="SayHelloWorld" class="com.yqy.CSDN.Spring.SayHelloWorld"></bean> </beans> (2)然后再修改测试文件:

package com.yqy.CSDN.Spring;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanConfigTest {@Testpublic void test() {ApplicationContext ctx = <span style="color:#ff0000;">new ClassPathXmlApplicationContext("applicationContext.xml");</span>SayHello s = (SayHello) ctx.getBean("SayHelloWorld");s.sayHello();}}

7.总结:

虽然在这个小例子很难看出注解的优势,但是当你要配置很多个Bean的时候呢?我觉得光是配置xml就够我们吃的了。所以我建议还是用注解的方式。

后面我会介绍更过的注解的方式,到时候你会发现就是一个字爽!请继续关注我的博文。

学好spring系列之Wiring Bean(装配Bean)相关推荐

  1. Spring实战之二:装配Bean

    2.1 Spring配置的可选方案 Spring提供了三种装配机制: 在XML中显式配置 在Java中显式配置 隐式的bean发现机制和自动装配 Best Practice:尽可能使用自动配置的机制, ...

  2. Spring实战——通过Java代码装配bean

    上篇说的是无需半行xml配置完成bean的自动化注入.这篇仍然不要任何xml配置,通过Java代码也能达到同样的效果. 这么说,是要把上篇的料拿出来再煮一遍? 当然不是,上篇我们几乎都在用注解的方式如 ...

  3. Spring常用注解,自动扫描装配Bean

    1 引入context命名空间(在Spring的配置文件中),配置文件如下: Xml代码 xmlns:context="http://www.springframework.org/sche ...

  4. Spring入门(二):自动化装配bean

    Spring从两个角度来实现自动化装配: 组件扫描(component scanning):Spring会自动发现应用上下文中需要创建的bean. 自动装配(autowiring):Spring会自动 ...

  5. Spring系列【11】配置Bean的初始化行为

    对某个Bean添加lazy-init属性:lazy-init 设置只对scop属性为singleton的bean起作用 1 <?xml version="1.0" encod ...

  6. Spring系列(二):Bean注解用法介绍

    今天给大家介绍一下Spring中Bean注解的用法,后续的文章给大家介绍Sping其他注解用法,希望对大家日常工作能有所帮助! 1.首先创建一个maven项目引入spring依赖 <depend ...

  7. 【Spring系列04】自动装配(Qualifier,Autowired,Resource讲解)

    这里写目录标题 一:Bean的自动装配 1.自动装配说明 2.测试环境搭建[方法一:在xml中显式配置] ++++++以下[方法三:隐式的bean发现机制和自动装配]+++++++ 3.byName[ ...

  8. Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】...

    本文借鉴:Spring学习,@Bean 的用法(特此感谢!) 自动装配 1.歧义性 我们知道用@Autowired可以对bean进行注入(按照type注入),但如果有两个相同类型的bean在IOC容器 ...

  9. Spring通过注解装配Bean

    通过注解实现ServiceImpl业务 一.使用@Component装配Bean 1. 定义类:User 在类上面加@Component注解,在属性上面加@Value值 package com.wbg ...

最新文章

  1. 远程访问,文件的压缩,ip地址的设置(9,11,12unit)
  2. win10远程桌面连接提示身份验证错误,要求的函数不受支持的解决方案
  3. vsftpd登录报530
  4. HDU 3646 DP + 二分
  5. DBATools PowerShell SQL Server数据库备份命令
  6. .net语言中使用MapWinGIS.ocx
  7. asp.net 大文上传配置
  8. Java 容器源码分析之 TreeMap
  9. Spring事务管理2----编程式事务管理
  10. 【配送路径规划】基于matlab遗传算法求解单配送中心多客户多车辆最短路径规划问题【含Matlab源码 1602期】
  11. mysql执行SQL脚本
  12. Funcode实现坦克大战(十个需求)
  13. Maltlab代码:四种基本的信道编码格式
  14. wps删除第二页页眉
  15. 如何设置某些动作在凌晨12点时自动更新
  16. c语言easyx改变字体大小,改变控制台字体大小
  17. Shell脚本:变量和运算符
  18. cpu选择K还是f?哪个更靠谱?
  19. BBS系统的设计与实现
  20. 使用Android模拟机开发调试移动端页面

热门文章

  1. 中国石油大学《化工过程设备设计》第一阶段在线作业
  2. 稀土掘金这个平台有什么问题?
  3. web发布与html ppt,web开发基础_HTML.ppt
  4. [附源码]计算机毕业设计Python+uniapp基于安卓的英语背单词app21a6v(程序+lw+APP+远程部署)
  5. 解决spring boot shiro的 Consider defining a bean named ‘shiroFilterFactoryBean‘ in your configuration问题
  6. python:第一天作业
  7. Win11系统个别软件中文乱码怎么办?
  8. 平板电脑可以打开HTML吗,网页体验 Flash无压力_平板电脑_平板电脑评测-中关村在线...
  9. 集成底座统一认证配置说明
  10. Golang 下载文件