首先,让我们先对Bean进行理解;什么是Bean,为什么要有Bean,如何装配Bean;
        1,什么是Bean?
            Bean你可以看成是一个组件,在框架开发中,所谓的项目就是由一个个的组件构建而成的,有拦截请求的前端控制器,有负责找到相应响应的适配器,有负责处理进行数据映射的映射器,而这些都可以称为组件:Bean;而Bean又不止这些,我们知道,在java中,都是通过调用对象,以及对象的属性和方法;而对象就可以看成是一个Bean,而我们调用对象都是通过new一个对象的方式,而Bean的功能就在于你可以不通过new的方式,而是通过其他方式来实现对象的调用,这就是所谓的Bean;
        2,为什么要有Bean?
            Bean的功能在于你可以通过xml,java以及注解这三种方式来实现,而不是调用对象,这样可以降低类之间的耦合度,符合高内聚低耦合的设计原则,再往深一点理解,在Spring中,对象无需自己查找或创建与其所关联的其他对象,相反,容器负责把需要相互协作的对象引用赋予各个对象,例如,一个订单管理组件需要信用卡认证组件,但他不需要自己创建信用卡认证组件,订单管理组件只需要表明自己两手空空,容器就会主动赋予它一个信用卡认证组件,就像一个骑士一样,如果你直接在骑士类里面调用救公主这个类的,创建对象,那么你可以每次都很及时地救到公主,但是如果你要去杀恶龙呢?那你还得再调用杀恶龙这个类,再调用对象,而救公主,杀恶龙这些类本身是等着你来调用的,只能被动调用,但是,如果你用Bean装配的话,你可以这样,将救公主,杀恶龙类声明为Bean;然后由Spring自带的容器来充当上帝的角色,上帝说,我给你骑士一个任务,你去救公主,杀恶龙,然后,骑士收到这个任务之后,就去执行这个任务了,这样的话,骑士不需要自己亲自去找到公主,找到恶龙,而是直接做,对于骑士来说更加方便,不会把多余的精力用在找这件事情上,也就是说骑士这个类更加贴近创建这个类的初衷,那就是直接做,而不是找,与公主,恶龙之间的关系也没有那么紧密,而对于公主,恶龙来说的话,声明为一个Bean,就算不是骑士去救,也还有其他类会来调用这个类,像是超人啊什么的,而这其中就是上帝在充当这个角色,也就是Spring的bean装配;
        3,如何装配Bean;
                装配Bean有三种可选方案;在XML中进行显示配置,在java中进行显示配置,隐式的bean发现机制和自动装配;
                我们的建议是尽可能地使用自动配置的机制,显式配置越少越好,而显式配置的话,就是java配置要由于xml配置;下面是三种配置方式的描述;
            首先,我们先说说优先级最高的自动装配;Spring从两个角度来实现自动化装配:组件扫描和自动转配;
            组件扫描是指通过显式配置的方式来声明一个扫描器来扫描被声明为Bean的Bean,而自动装配是指将一个已经声明的Bean自动装配到另一个bean中,即实现我们前面说的通过装配bean的方式来实现对象的调用;
            先声明一个接口;

public interface compactDisc(){
void play();
}

          然后做一个实现类;

@Component
public class SgtPeppers implements CompactDisc{
private String title = "...";
private String artist = "....";
public void play(){
System.out.println("...");
}
}

  其中,使用到了@Component注解,这个简单的注解声明该类会作为组件类;

下面我们要启动自动扫描;

@Configuration
@ComponentScan
public class CDPlayerConfig(){ }

  通过java配置的方式设置扫描器,能够在这个包以及这个包下的所有子包查找带有@Component注解的类;

<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package = "soundsystem"/>
</bean>

  这个是通过xml配置的方式进行扫描器的声明;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes == CDPlayerConfig.class)
public class CDPlayerTest{
@Autowired
private CompactDisc cd;
@Test
public void cdShouldNotBeNull(){
assertNotNull(cd);
}
}

  

这个是测试类;
你可以为组件扫描的Bean命名;通过以下方式;
        @Component("longlyHeartsClub")
        public class Sgtpeppers implements CompactDisc{}
另外提一下,还有另一种方式;
        @Named(("longlyHeartsClub")
        public class Sgtpeppers implements CompactDisc{}
设置组件扫描的基础包;
@Configuration
@ComponentScan("soundsystem")
public class CDPlayerConfig(){}
        你如果要扫描多个包的话可以这样;
@Configuration
@ComponentScan(basePackget = {"soundsystem","video"})
public class CDPlayerConfig(){};
        如果你要扫描的是类或接口的话
@COnfiguration
@ComponentScan(basePackageClasses = {CDPlayer.class,DVDPlayer.class})
public class CDPlayerConfig(){};
以上是组件扫描的功能,下面是自动装配的功能;
通过两种方式实现将一个已经声明的Bean装配到另外一个Bean中, 构造器和Setter方法;
下面是构造器的方法;

@Component
public class CDplayer implements MediaPlayer{
private CompactDisc cd;
@Autowired
public CDplayer(CompacDisc cd){
this.cd = cd;
}
public void play(){
cd.play();
}
}

  还可以通过Setter方法

@Autowired
public void setCompactDisc(CompactDisc cd){
this.cd = cd;
}

  

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = CDPlayerConfig.class)
public class CDPlayerTest{
@Rule
public final StandardOutputStreamLog log = new StandardOutputStreamLog();
@Autowired
private MediaPlayer player();
@Autowired
private CompactDisc cd;
@Test
public void cdShouldNotBeNull(){
assertNotNull(cd);
}
}

  

下面是第二种方式java显式配置;
还是分为两个方面,如何配置Bean,以及实现Bean的依赖;
    声明简单的Bean
    @Bean
    public CompactDisc sgtpetters(){
        return new SgetPeppers();
    }
    通过返回一个对象来实现Bean的声明;
    这样的话,就可以实现随机声明任意一个Bean的方法,更加灵活多变;
    你也可以对这个Bean进行命名;
    接下来我们来实现注入,这里有一点要注意一下的就是你的注入Bean是可以通过任何形式实现的;
    @Bean
    public CDPlayer cdPlayer(){
        return new CDPlayer(sgtPeppers());
    }
    这是一种方式,当然这里的Bean创建是单例的,即使有多个调用这个sgePeppers(),也是同一个;
    这样也可以
    @Bean
    public CDPlayer cdPlayer(CompactDisc compactdisc){
        return new CDPlayer(compactdisc);
    }
以上就是java配置描述的方法了;
接下来就是xml配置的方法了,不愧是最老的方法,语法设置是前面两种方法加起来的两倍的说。。。
        首先是声明一个简单的bean;
        <bean class = "soundsystem.SgtPeppers">
        如果你要命名的话
        <bean id = "compactDisc" class = "soundsystem.SgtPeppers">
        接下来呢,我们想要用构造器的方法注入bean引用,先用这个<constructor-arg>元素;
        <bean id = "cdPlayer" class = "soundsystem.CDPlayer">
            <constructor-arg ref = "compactDisc">
        </bean>
        其中,compactDisc是一个注入Bean的id;
        还可以用c命名空间的方法,注意c是constructor-arg元素对应的;
        <bean id = "cdPlayer" class = "soundsystem.CDPlayer"
                c:cd-ref = "compactDisc">
            这里的cd相当于给注入Bean起一个名字;
        还可以这样命名
        <bean id = "cdPlayer" class = "soundsystem.CDPlayer"

                c:_0-ref = "compactDisc">
        或者这样
        <bean id = "cdPlayer" class = "soundsystem.CDPlayer"
                c:_-ref = "compactDisc">
       那么如何将字面量注入到构造器中呢?
        <bean id = "cdPlayer" class = "soundsystem.CDPlayer">

            <constructor-arg value = "...">
        </bean>
        那就是用value了,记住,引用Bean用ref,注入字面量用value,然后c命名空间的方式还是不变的;
    当然了,我们除了装配单个字面量,还可以装配集合;
    <bean id = "cdPlayer" class = "soundsystem.CDPlayer">

            <constructor-arg value = "...">
            <constructor-arg>
                <list>
                    <value>.....</value>
                    <value>.....</value>
                </list>
        </bean>
        还可以注入多个注入Bean
    <bean id = "cdPlayer" class = "soundsystem.CDPlayer">

            <constructor-arg value = "...">
            <constructor-arg>
                <list>
                    <ref bean = "sgtPeppers"/>
                    <ref bean = "agtPeppers"/>
        </bean>

当然我们也可以用set集合

    <bean id = "cdPlayer" class = "soundsystem.CDPlayer">

            <constructor-arg value = "...">
            <constructor-arg>
                <set>
                    <value>.....</value>
                    <value>.....</value>
                </set>
        </bean>

设置属性:好吧,你没有听错,我们要用另一种方法了,这两种方法其实本质是没有区别的但是我们竟然要因此而学另外一种元素和另一种命名空间,真是够了。。。

        首先是声明一个简单的bean;
        <bean class = "soundsystem.SgtPeppers">
        如果你要命名的话
        <bean id = "compactDisc" class = "soundsystem.SgtPeppers">
            <property name = "compactDisc" ref = "compactDisc"/>
        </bean>
        命名空间p
        <bean id = "cdPlayer" class = "soundsystem.CDPlayer"
                p:cd-ref = "compactDisc">
            这里的cd相当于给注入Bean起一个名字;
        还可以这样命名
        <bean id = "cdPlayer" class = "soundsystem.CDPlayer"

                p:_0-ref = "compactDisc">
        或者这样
        <bean id = "cdPlayer" class = "soundsystem.CDPlayer"
                p:_-ref = "compactDisc">

。。你没有发现惊人的相似吗。。。。

        其他的像装配字面量,装配集合,都是一样的。。。我就不一个个Ctrl+c,Ctrl+v了。。。
        接下来是讲一下导入和混合配置的方法,我们如何这三种不同的配置方法给混合使用呢?
        下面是解决方法;
        在JavaConfig中引用XML配置;
        先讲讲如何将分离出来的两个Bean进行组合;

@Configuration
public class CDConfig{
@Bean
public CompactDisc compactDisc(){
return new SgtPeppers();
}
}

  然后我们用@import(CDConfig.class)来实现组合;

@Configuration
@Import(CDConfig.class)
public class CDPlayerConfig{
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
return new CDPlayer(compactDisc);
}
}

  或者我们把xml拼到java中;

@Configuration
@Import(CDPlayerConfig.class)
@ImportResource("classpath:cd-config.xml")
public class SoundSystemConfig{}

  接下来我们反过来,将java拼到xml中;也就是用<bean>将Bean给作为Bean拼进来;

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
<bean class = "soundsystem.CDConfig"/>
<bean id = "cdPlayer"
class = "soundsystem.CDPlayer"
c:cd-ref = "compactDisc"/>
</bean>

  或者,我们可以把java和xml都集合来,配置在同一个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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
<bean class = "soundsystem.CDConfig"/>
<import resource = "cdplayer-config.xml"/>
</bean>

  

SpringBean基础装配的更多相关文章

  1. Spring容器装配Bean的三种方式

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  2. HowToDoInJava Spring 教程·翻译完成

    原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 Spring 5 Spr ...

  3. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(8):装配SpringBean概述(如何合理使用装配级别)

    一. 装配Bean概述  关于如何将自己开发的Bean配置到Spring IoC容器中,大部分场景下,我们都会使用ApplicationContext的具体实现类,因为对应的Spring IoC容器功 ...

  4. Spring基础使用(一)--------IOC、Bean的XML方式装配

    基础 1.xml文件基础格式: <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns=&q ...

  5. Spring基础知识之装配Bean

    装配(wiring):创建应用对象之间协作关系的行为.这是依赖注入的本质. Spring配置的可选方案 Spring提供了三种装配机智: 1)在XML中进行显示装配 2)在java中进行显示装配 3) ...

  6. Spring基础(一)------装配Bean

    一.Spring配置的可选方案 三种主要的装配机制: 在xml文件中进行显示配置: 在java中进行显示配置: 隐式的bean发现机制和自动装配. 使用建议:尽可能使用自动配置的机制,显示配置越少越好 ...

  7. 装配SpringBean(三)--XML方式实例

    前一篇文章中已经介绍了XML方式装配bean的方式,本文将综合这些方式举一个实例并进行测试,我会把所有类型的参数都放在同一个类中进行测试,下面是我的类结构: 上图是我画的一个基本结构,可以看出该类中有 ...

  8. 装配SpringBean(二)--XML方式介绍

    装配SpringBean,我理解的意思就在容器中定义一个bean,然后让容器通过某种方式找到它.因为在Spring中一切皆资源,资源就是所谓的bean,我们怎么才能从容器中获取这些资源呢?那就是控制反 ...

  9. spring的自动装配基础

    当开始看别人的代码使用注解的时候,以为照着别人的代码写,也写一个注释就能实现这样的功能,但是,现在开始考虑自动装配时怎样实现的. 首先,如果如果知道如何手动在xml配置中"装配bean&qu ...

随机推荐

  1. Visual Studio 2017 for Mac 连接Git的奇怪问题

    VS for Mac连接Git的时候遇到个奇怪的问题, 无法将已存在的解决方案绑定并提交到GitHub中去. VS版本7.3.3 问题复现 以为自己操作有问题, 新建项目测试一下, 新建的时候没有勾选 ...

  2. Python数据结构之三——dict(字典)

    Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ 知识源于生活.Python也是如此. 提到字典,我首先想到的是数学大师--高斯. 为何想起他呢?这主要是因为高斯算法 ...

  3. 关于JavaScript的事件处理一些知识

    <JS事件处理> Event对象详细信息:http://www.w3school.com.cn/jsref/dom_obj_event.asp JS原生支持3中绑定事件方式: 1.以标签属 ...

  4. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...

  5. Quartz.NET 3.0 正式发布

    Quartz.NET是一个强大.开源.轻量的作业调度框架,你能够用它来为执行一个作业而创建简单的或复杂的作业调度.它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等.在2017 ...

  6. 腾讯IVWEB前端工程化工具feflow思考与实践

    本篇文章主要介绍腾讯IVWEB团队从0到1在工程化的思考和实践.feflow的全称是Front-end flow(前端工作流),致力于提升研发效率和规范的工程化解决方案.愿景是通过feflow,可以使 ...

  7. git命令行工作的正确姿势

    git命令行创建并提交新分支到mater分支的常规步骤 git branch new_branch git status 查看修改的文件 git add changed_files git commi ...

  8. CentOS6搭建OpenVPN服务器

    一.服务器端安装及配置 服务器环境:干净的CentOS6.3 64位系统 内网IP:10.143.80.116 外网IP:203.195.xxx.xxx OpenVPN版本:OpenVPN 2.3.2 ...

  9. 机器学习之支持向量机(三):核函数和KKT条件的理解

    注:关于支持向量机系列文章是借鉴大神的神作,加以自己的理解写成的:若对原作者有损请告知,我会及时处理.转载请标明来源. 序: 我在支持向量机系列中主要讲支持向量机的公式推导,第一部分讲到推出拉格朗日对 ...

  10. rxjs-流式编程

    前言 第一次接触rxjs也是因为angular2应用,内置了rxjs的依赖,了解之后发现它的强大,是一个可以代替promise的框架,但是只处理promise的东西有点拿尚方宝剑砍蚊子的意思. 如果我 ...