Spring学习笔记之基于XML的Bean装配详解(二)

【Spring】— Spring中Bean的装配方式 在Spring实例化Bean的过程中,Spring首先会调用Bean的默认构造方法来实例化Bean对象,然后通过反射的方式调用setter()方法来注入属性值。在Spring中,尽管使用XML配置文件可以实现Bean的装配工作,但如果应用中有很多Bean,就会导致XML配置文件过于臃肿,给以后的维护和升级工作带来一定的困难。虽然使用注解的方式装配Bean在一定程度上减少了配置文件中的代码量,但是也有企业项目中是没有使用注解方式开发的,那么有没有什么办法既可以减少代码量,又能够实现Bean的装配呢? 阅读详情

1、概述
IOC和DI的概念:​

* IOC -- Inverse of Control,控制反转,将对象的创建权反转给Spring!!

​ * DI -- Dependency Injection,依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件中!!

如果UserServiceImpl的实现类中有一个属性,那么使用Spring框架的IOC功能时,可以通过依赖注入把该属性的值传入进来!!

2、构造方法注入
构造方法注入就是利用bean的构造方法完成对bean中属性的赋值

创建Car实体类,提供有参构造方法Car.java
 

package com.day01.domain;
 
import java.io.Serializable;
 
/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 10:34 2018/11/8
 */
public class Car implements Serializable {
    private String name;
    private Double price;
 
    public Car(String name, Double price) {
        this.name = name;
        this.price = price;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Double getPrice() {
        return price;
    }
 
    public void setPrice(Double price) {
        this.price = price;
    }
 
    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

//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 id="car" class="com.day01.domain.Car">
       <constructor-arg name="name" value="保时捷"></constructor-arg>
       <constructor-arg name="price" value="2000000.0"></constructor-arg>
   </bean>
 
</beans>

//tset
package com.day01.test;
 
import com.day01.dao.AddrDao;
import com.day01.dao.UserDao;
import com.day01.domain.Car;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
 
/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 19:30 2018/11/7
 */
public class TestIoC {
 
    @Test
    public void test6(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext2.xml");
        Car car = (Car) ac.getBean("car");
        System.out.println("car = " + car);
    }
 
}

 结果:

3、set方法注入

set方法注入就是利用bean中属性的set方法对属性赋值。实体类中不用写getXXX方法

创建People.java实体类、提供属性的set方法、不用提供有参构造 

package com.day01.domain;
 
import java.io.Serializable;
 
/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 10:46 2018/11/8
 */
public class People implements Serializable {
    private String name;//提供对应的set方法
    private String address;
    private Car car;//对象属性
 
    public void setName(String name) {
        this.name = name;
    }
//    public String getName(){
//        return this.name;
//    }
 
    public void setAddress(String address) {
        this.address = address;
    }
 
    public void setCar(Car car) {
        this.car = car;
    }
 
    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", car=" + car +
                '}';
    }
}

//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 id="car" class="com.day01.domain.Car">
       <constructor-arg name="name" value="保时捷"></constructor-arg>
       <constructor-arg name="price" value="2000000.0"></constructor-arg>
   </bean>
 
    <!--set方法注入-->
    <bean id="people" class="com.day01.domain.People">
        <property name="name" value="小刚"></property>
        <property name="address" value="上海"></property>
        <property name="car" ref="car"></property>
    </bean>
</beans>

//tset
package com.day01.test;
 
import com.day01.dao.AddrDao;
import com.day01.dao.UserDao;
import com.day01.domain.Car;
import com.day01.domain.People;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
 
import java.time.Period;
 
/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 19:30 2018/11/7
 */
public class TestIoC {
 
 
    @Test
    public void test7(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext2.xml");
        People people = (People) ac.getBean("people");
        System.out.println("people = " + people);
    }
}

 

 

 

4、set方法注入其它写法
1)、p命名空间的写法

语法:p:属性名=”值“

p:对象属性名-ref = "bean的id"

applicationContext2.xml

约束:加这行:xmlns:p="http://www.springframework.org/schema/p"
 

<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <!--构造方法注入-->
   <bean id="car" class="com.day01.domain.Car">
       <constructor-arg name="name" value="保时捷"></constructor-arg>
       <constructor-arg name="price" value="2000000.0"></constructor-arg>
   </bean>
 
    <!--set方法注入-->
    <!--<bean id="people" class="com.day01.domain.People">-->
        <!--<property name="name" value="小刚"></property>-->
        <!--<property name="address" value="上海"></property>-->
        <!--<property name="car" ref="car"></property>-->
    <!--</bean>-->
    <!--p命名空间写法-->
    <bean id="people" class="com.day01.domain.People" p:name="小刚" p:address="北京" p:car-ref="car">
 
    </bean>
</beans>

//test
    @Test
    public void test7(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext2.xml");
        People people = (People) ac.getBean("people");
        System.out.println("people = " + people);
    }

2)、SpEL的写法

SpEL:Spring  Expression Language

语法:

注入字符串:#{‘字符串’}

注入数字:#{数字}

注入其它对象:#{对象id}

applicationContext2.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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <!--构造方法注入-->
   <bean id="car" class="com.day01.domain.Car">
       <constructor-arg name="name" value="保时捷"></constructor-arg>
       <constructor-arg name="price" value="2000000.0"></constructor-arg>
   </bean>
 
    <!--set方法注入-->
    <!--<bean id="people" class="com.day01.domain.People">-->
        <!--<property name="name" value="小刚"></property>-->
        <!--<property name="address" value="上海"></property>-->
        <!--<property name="car" ref="car"></property>-->
    <!--</bean>-->
    <!--p命名空间写法-->
    <!--<bean id="people" class="com.day01.domain.People" p:name="小刚" p:address="北京" p:car-ref="car">-->
    <!--</bean>-->
    <!--SpEL方法注入-->
    <bean id="people" class="com.day01.domain.People">
        <property name="name" value="#{'小刚'}"></property>
        <property name="address" value="#{'北京'}"></property>
        <property name="car" value="#{car}"></property>
    </bean>
</beans>

//test
    @Test
    public void test7(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext2.xml");
        People people = (People) ac.getBean("people");
        System.out.println("people = " + people);
    }

5、数组或List注入(重点)

 

当bean中的属性是List或数组类型。那么该怎么给List或数组注入值呢?数组和list注入的写法是一样的。

新建bean类、InfoBean.java

package com.day01.domain;
 
import java.util.List;
import java.util.Map;
import java.util.Set;
 
/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 11:18 2018/11/8
 */
public class InfoBean {
    private List<String> list;
    private Set<String> set;
    private Map<String,String> map;
 
    public void setList(List<String> list){
        this.list = list;
    }
 
    public void setSet(Set<String> set) {
        this.set = set;
    }
 
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
 
    @Override
    public String toString() {
        return "CollectionBean{" +
                "list=" + list +
                ", set=" + set +
                ", map=" + map +
                '}';
    }
}

//test
 
    @Test
    public void test8(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext2.xml");
        InfoBean infoBean = (InfoBean) ac.getBean("listId");
        System.out.println("infoBean = " + infoBean);
    }

 

 

<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <!--构造方法注入-->
   <bean id="car" class="com.day01.domain.Car">
       <constructor-arg name="name" value="保时捷"></constructor-arg>
       <constructor-arg name="price" value="2000000.0"></constructor-arg>
   </bean>
 
    <!--set方法注入-->
    <!--<bean id="people" class="com.day01.domain.People">-->
        <!--<property name="name" value="小刚"></property>-->
        <!--<property name="address" value="上海"></property>-->
        <!--<property name="car" ref="car"></property>-->
    <!--</bean>-->
    <!--p命名空间写法-->
    <!--<bean id="people" class="com.day01.domain.People" p:name="小刚" p:address="北京" p:car-ref="car">-->
    <!--</bean>-->
    <!--SpEL方法注入-->
    <bean id="people" class="com.day01.domain.People">
        <property name="name" value="#{'小刚'}"></property>
        <property name="address" value="#{'北京'}"></property>
        <property name="car" value="#{car}"></property>
    </bean>
 
 
    <bean id="listId" class="com.day01.domain.InfoBean">
        <!--list注入-->
        <property name="list">
            <list>
                <value>大罗</value>
                <value>小罗</value>
            </list>
        </property>
        <!--set集合注入-->
        <property name="set">
            <set>
                <value>鸠摩智</value>
                <value>无崖子</value>
            </set>
        </property>
        <!--map集合注入-->
        <property name="map">
            <map>
                <entry key="id" value="1"></entry>
                <entry key="username" value="张三"></entry>
            </map>
        </property>
    </bean>
</beans>

 

8、Properties的注入(重点)
有的时候,bean中的属性是Properties类型。那么该怎么给Properties类型的属性注入值呢?

Properties语法:

<prop>:表示一个键值对;

<prop>中的key表示键,在<prop></prop>中写的是值;

修改InfiBean.java,在其中添加一个Properties类型的属性并提供set方法:

package com.day01.domain;
 
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
 
/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 11:18 2018/11/8
 */
public class InfoBean {
    private List<String> list;
    private Set<String> set;
    private Map<String,String> map;
    private Properties properties;
 
    public void setList(List<String> list){
        this.list = list;
    }
 
    public void setSet(Set<String> set) {
        this.set = set;
    }
 
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
 
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
 
    @Override
    public String toString() {
        return "CollectionBean{" +
                "list=" + list +
                ", set=" + set +
                ", map=" + map +
                ", properties=" + properties +
                '}';
    }
}

//xml
<!--preperties注入-->
        <property name="properties">
            <props>
                <prop key="id">2</prop>
                <prop key="name">小明</prop>
            </props>
        </property>

//test
    @Test
    public void test8(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext2.xml");
        InfoBean infoBean = (InfoBean) ac.getBean("listId");
        System.out.println("infoBean = " + infoBean);
    }

9、配置文件的分离
方式一:

在整个工程中有applicationContext.xml和applicationContext2.xml两个配置文件。可以把aplicationContext.xml看成一个总的配置文件,在其中包含applicaitonContext2.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userDao" class="com.day01.dao.impl.UserDaoImpl" init-method="init" destroy-method="destroy"></bean>
    <bean id="factory" class="com.day01.factory.Factory"></bean>
    <bean id="deptDao" factory-bean="factory" factory-method="create"></bean>
 
    <import resource="applicationContext2.xml"/>
</beans>

此时,创建IOC容器时,只需要加载applicationContext.xml即可,因为在applicationContext.xml引入了applicationContext2.xml文件,所以,applicationContext2.xml也会加载

方式二:

@Test
public void test4(){
    //创建Spring工厂(创建IOC容器)
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
    DeptDao deptDao = (DeptDao) ac.getBean("deptDao");
    deptDao.save();
 
}

 

ATAC-seq数据分析流程 Outline0. ATAC-seq原理0.1 染色体结构0.2 原理0.3 结果0.4 意义1. ATAC-seq数据分析流程1.1 上游分析(1)序列质控和比对(2)序列筛选1.2 下游分析1.3 进阶分析 0. ATAC-seq原理 0.1 染色体结构 0.2 原理 0.3 结果 0.4 意义 1. ATAC-seq数据分析流程 1.1 上游分析 (1)序列质控和比对 fastqc trim_golare bowtie2 mapping时要加上参数 --very-sensitive -X 2000 阅读详情

相关推荐

文章详细介绍了进行DoIP(DiagnosticoverInternetProtocol)测试的完整过程,包括样件的正确接线、CANoe软件的环境配置、端口设置、VLAN配置、IP和MAC地址的设定

关于Tester和DUT的地址,其实最主要的就是DUT的IP、MAC和逻辑地址,如果不知道Tester的IP、MAC和逻辑地址,可以配置为与DUT同一网段的就可以。ps:最重的是知道DUT的IP、逻辑、MAC地址,如果有VLAN也需要知道,Tester的地址可以根据DUT地址进行设定,其余的值可根据DoIP的报文查到相关参数。ps:如果在通信中没有建立VLAN,但是源地址和目的地址都填写正确,此时就要考虑是否是遗漏了VLAN,建立一个VLAN,在重新试试是否可通信。此处与硬件连接是相对应的,要注意!

qq_40965861的博客 1128

infobean

package cn.com.mbp.hr.employee.OutSourcing.orm;import java.sql.Timestamp;/** * 机能名: 基本设计 /外派信息 * 功能说明:员工外派信息一览 * 式样书:基本设计_外派信息.xls * @version 1.0 2011/3/21 * @author 张蕾(s1011524) */public class OutSourcingInfoBean {//外派IDprivate Integer outsourcingid;//员工I

leileiteppei的专栏 454

STM32F103ZE精英板驱动ESP8266与DHT11构建物联网网关,实现乐联网温湿度数据实时监控

本文详细介绍了如何使用STM32F103ZE精英板驱动ESP8266与DHT11构建物联网网关,实现乐联网温湿度数据实时监控。从硬件选型、连接调试到乐联网平台配置和STM32程序开发,提供了完整的实现步骤和常见问题解决方案,适合物联网入门开发者参考。

weixin_30823001的博客 78

java关联查询实战_MapReduce实战(五)实现关联查询

需求:利用MapReduce程序,实现SQL语句中的join关联查询。订单数据表order:iddatepidamount100120150710P00012100220150710P00013100220150710P00023100320150710P00034商品信息表product:pidpnamecategory_idpriceP0001小米610002499P0002锤子T310012...

weixin_32475629的博客 407

使用【阿里云百炼】搭建自己的大模型

本文介绍阿里云百炼大模型平台,其为企业级服务平台,融合通义千问等模型,支持多模态能力,提供一站式工具降低开发门槛。重点讲解智能体应用及大模型搭建步骤,含进入创新应用界面、选模型配参数、输指令、导数据、加载知识库、获取API Key、加样例库、配置MCP,还提及模型调试与多平台发布,并附试用链接,助力企业与开发者快速搭建适配业务的AI模型。

Larry的博客 4738

华为云Stack交付实战:从工勘到上线的全流程拆解

本文详细拆解华为云Stack交付全流程,从项目启动、工勘、LLD设计到硬件部署和软件安装,提供实战技巧与避坑指南。重点解析华为云Stack交付流程中的关键环节,如标准化工具使用、规范化文档管理和流程化协作,帮助团队高效完成从工勘到上线的复杂项目交付。

weixin_29243063的博客 156

XmlBeanFactory

接着分析XmlBeanFactory容器,上一节已经把他和DefaultListableBeanFactory做了比较,下面就是以他为研究对象进行深入分析. BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactory.xml")); 根据上面的时序图,我们可以知道XmlBeanFactory初始化的整个过程. 下面就分别分析各个步骤. 配置文件的封装 通过代码可以知道,配置文件是通过ClassPathResource进行

qq_40708942的博客 1037

【卫星语音通信】神经网络语音编解码算法:AudioDec

最新研究表明,通过深度学习模型对语音信号进行智能压缩与重建,可在12 kbps码率下实现48 kHz采样率的高保真语音还原,其主观音质评分(MOS)可达3.9分(满分4.27分),远超传统参数编码技术。这意味着未来卫星电话的通话质量有望达到CD级水准,而蜂窝网络的语音业务带宽需求可降低60%以上,为蜂窝和卫星网络中的大规模物联网语音交互铺平道路。它的诞生为神经音频编解码技术带来了一次重要升级,有助于让未来实时语音交互更流畅、更清晰,也让我们进一步体验到人工智能与音频信号处理结合所带来的创新可能性。

u011376987的博客 1472

16. spring-容器: 探索BeanFactory-XmlBeanFactory, DefaultListableBeanFactory, XmlBeanDefinitionReader

BeanFactory BeanFactory是所有Spring容器的根接口,提供了基本的容器操作方法,定义如下: package org.springframework.beans.factory; import org.springframework.beans.BeansException; import org.springframework.core.ResolvableType; import org.springframework.lang.Nullable; public interf

elegent Developer's 的博客 292

2025.06.06【Ribo-seq】|RiboCode:基于Ribo-seq数据的全基因组翻译ORF检测工具详解与实战流程

大家好!今天我们要学习的是RiboCode——一个专为Ribo-seq(核糖体足迹测序)数据设计的高质量翻译ORF(开放阅读框)检测工具。RiboCode能够帮助我们在全基因组范围内精准识别翻译事件,发掘经典CDS之外的uORF、dORF、重叠ORF等新型翻译本,极大拓展了我们对转录本翻译潜能的认知。RiboCode 是由清华大学杨学睿课题组开发的开源软件,支持Linux/Mac平台,采用Python实现。自动化流程:一条命令即可完成注释准备、P-site定位、ORF预测。高灵敏度与特异性。

1856

数仓建模:维度表合并时,如何处理可能出现的数据冲突?

通过以上方法,可以有效地处理维度表合并时可能出现的数据冲突,确保合并后的数据完整性、一致性和准确性,满足业务需求和数据仓库的性能要求。在合并过程中,需要根据实际情况选择合适的处理方法,并进行充分的测试和验证。(2)实战中总结的SQL技巧,帮助SQLBOY在SQL语言上有质的飞越,无论你应对业务难题及面试都会游刃有余【如果您觉得本文还不错,对你有帮助,那么不妨可以关注一下我的数字化建设实践之路专栏,这里的内容会更精彩。技巧总结,让你认识不一样的数仓。,数据库会抛出异常,可根据异常处理机制解决。

石榴姐yyds 1132

Introspector、BeanInfo的用法,不知与Class有何区别

 BeanInfo info = Introspector.getBeanInfo( connections.getClass() );//在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件。 PropertyDescriptor[] descritors = info.getPropertyDescriptors();//获得 beans PropertyDescri

kubete的专栏 6426

【Halcon-1D测量】measure_pairs 函数功能(用于提取垂直于矩形/环形弧主轴的直边对)

HALCON算子measure_pairs是1D测量模块的基础工具,专用于提取垂直于矩形/环形弧主轴的直边对。该算子通过振幅阈值和灰度过渡规则(如positive/negative)进行边对分组,支持_strongest后缀选择最强边缘避免误配对。输出包含边缘坐标、振幅及内外间距(IntraDistance/InterDistance)。关键限制包括仅适用于直边、Sigma需≤0.5×测量长度,且忽略图像域。相比模糊版本算子,它更适用于边缘清晰的简单场景(如电子元件间距测量)。典型应用需配合gen_meas

weixin_45590420的博客 303

Spring3学习笔记(二)装配bean基于XML或基于注解

实例化方式 3种bean实例化方式:默认构造、静态工厂、实例工厂 默认构造:< bean id="" class=""> 必须提供默认构造 静态工厂: 常用与spring整合其他框架(工具) 静态工厂:用于生成实例对象,所有的方法必须是static < bean id="" class=“工厂全限定类名” factory-method=“静态方法”> ...

qq_41816516的博客 223

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Spring学习笔记:Bean的装配方式

学习内容:Bean的装配方式 1.

qq_49019244的博客 5261

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

基于 XML 的 Spring Bean 自动装配详解

核心价值:减少冗余配置,提升开发效率。关键点理解byNamebyType的区别。掌握歧义性解决方案(primary谨慎使用:避免因过度依赖自动装配导致项目维护困难。

m0_75107803的博客 1154

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring Bean的装配方式 第1关:基于 XML 的 Bean 装配

基于 XML 的 Bean 装配

于建章的博客 2279

Spring:基于XML装配bean

详细介绍了通过xml装配bean的过程,介绍了xml中各种标签的使用方式。

Ju的博客 2758

Spring bean的装配方法

主要存在三种方法(1).在XML文件中进行显式配置(2).在java中进行显示配置(3).隐式的bean发现机制和自动装配。

weixin_42581560的博客 1779

Spring中Bean的三种装配方式

bean的装配通俗点就是依赖注入(spring的特点之一),再说通俗点就是类中属性的赋值,而这种赋值不是由我们直接在代码中赋值,而是通过在配置文件中配置值类实现的,给他起了一个高大上的名字,让我来说就是把赋值包装了一层还有一层呀。让我们一起看看这三种装配方式怎么实现的吧!!   1、基于XML的装配 基于xml的装配方式有俩种表现形式,在Java中,大家对类中属性赋值一般有俩种吧,第一种就是...

苦行僧的博客 5281

【Spring】Spring中的Bean - 5、Bean的装配方式(XML、注解(Annotation)、自动装配)

Bean的装配方式 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 文章目录Bean的装配方式基于XML的装配基于注解(Annotation)的装配自动装配 IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。 控制反转(IoC...

渐若窥宏大的博客 1857

实验1 Spring IoC中的Bean装配

实验1 Spring IoC中的Bean装配

派大星子的博客 2374

java xml注入bean_Spring实战之通过XML装配bean

尽管Spring长期以来确实与XML有着关联,但现在需要明确的是,XML不再是配置Spring的唯一可选方案。Spring现在有了强大的自动化配置和基于Java的配置,XML不应该再是你的第一选择了。不过,鉴于已经存在那么多基于XML的Spring配置,所以理解如何在Spring中使用XML还是很重要的。但是,我希望本节的内容只是用来帮助你维护已有的XML配置,在完成新的Spring工作时,希望你...

weixin_31621945的博客 3222

Spring中Bean的装配方式

Bean的装配就是Bean依赖注入。Spring容器提供了3中常用的Bean的装配方式,分别是 基于XML的装配 、基于注解的装配 和 自动装配 。

Nancy的博客 1565

【手撕 Spring】Spring 如何装配 Bean

在 Spring 中,对象无需自己查找或创建与其所关联的其他对象。相反,容器负责把需要相互协作的对象引用赋予各个对象。例如,一个订单管理组件需要信用卡认证组件,但它不需要自己创建信用卡认证组件。订单管理组件只需要表明自己两手空空,容器就会主动赋予它一个信用卡认证组件。

激流丶的博客 4556

用XML的方式装配Bean

用XML的方式装配Bean

yu的博客 1240
上一篇: Spring学习笔记之控制反转IOCxml模式
下一篇: spring学习笔记之注解注入方式详解(自动装配)详解
iamlinuxasd
博客等级 码龄10年 4粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值