Spring IOC基本概念

Spring——IOC容器基本概念 前一段时间在学习Spring,感觉Spring确实挺有魅力的,学习之后,对学过的知识简单的做一下总结,如果要总结IOC容器自然是少不了的,我前边有过一篇文章来介绍IOC的思想,但是没有涉及到Spring容器,在这里结合着Spring容器来看一下IOC的相关知识和美妙之处吧!IOC是Spring容器的核心,Spring的AOP和声明式事务等功能的实现都依赖于IOC容器的存在。         写着 阅读详情

Spring IOC

在这里插入图片描述

一、Spring框架

Spring框架是一个开源的 JavaEE 的应用程序、其主要核心是 IOC(控制反转/依赖注入)与AOP(面向切面)两大技术,实现项目在开发过程中的轻松解耦,提高项目的开发效率。

Spring IOC(控制反转/依赖注入)

Spring AOP

Spring JDBC + 事务

在这里插入图片描述

1.Spring作用

Dao层:JDBC操作 对应的框架:Mybatis

Service层:Spring框架不是针对service层的业务逻辑的 service没有适合框架

Controller层:Servlet(接收请求 响应数据 地址配置 页面转发) 对应框架:Spring MVC、

Spring基于分布式的应用程序、基于轻量级的框架

配置管理

Bean对象的实例化-IOC

集成第三方的框架:Mybatis、Hibernate框架(持久层框架)、Spring MVC、Spring Security权限

Quartz时钟框架(定时任务处理):

1.自带服务

2.Mail邮件发送

3.定时任务处理-定时调度(定时短信、定时任务)

4.消息处理(异步处理)

2.Spring模块划分

Spring IOC模块:Bean对象的实例化 Bean的创建

Spring AOP模块:动态代理 面向切面编程

Spring JDBC+事务模块

Spring Web模块

3.配置环境

1.修改单元测试 JUnit 版本
<dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.12</version>
 <scope>test</scope>
</dependency>
2.添加 Spring 框架的依赖坐标

Maven仓库:https://mvnrepository.com/

<!-- 添加Spring框架的核心依赖 -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.2.4.RELEASE</version>
</dependency>
3.在 src\main\resources 目录下新建 spring.xml 文件,并拷贝官网文档提供的模板内容到 xml 中。

配置 bean 到 xml 中,把对应 bean 纳入到 Spring 容器来管理spring.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
                     https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
    xmlns 即 xml namespace xml使用的命名空间
    xmlns:xsi 即xml schema instance xml 遵守的具体规范
    xsi:schemaLocation 本文档xml遵守的规范 官方指定
 -->
</beans>
4.在 spring.xml 中配置 Bean 对象
<!--
id:bean对象的id,唯一标识。一般是Bean对象的名称的首字母小写
class:bean对象的类路径
-->
<bean id="userService"
class="com.xxxx.service.UserService"></bean>
5.加载配置文件,获取实例化对象
	// 获取Spring上下文环境 (加载配置文件)
    ApplicationContext ac = new
ClassPathXmlApplicationContext("spring.xml");
    // 通过getBean方法得到Spring容器中实例化好的Bean对象 (实例化Bean对象)
    // userService代表的是配置文件中bean标签的id属性值
    UserService userService = (UserService)ac.getBean("userService");
    // 调用方法 (使用实例化对象)
    userService.test();

二、Spring IOC 配置文件加载

1.Spring 配置文件加载

根据相对路径加载资源

ApplicationContext ac  = new ClassPathXmlApplicationContext("spring.xml");

根据绝对路径加载资源(了解)

ApplicationContext ac = newFileSystemXmlApplicationContext("C:/IdeaWorkspace/spring01/src/main/resources/spring.xml");  

2.Spring 多配置文件加载

Spring 框架启动时可以加载多个配置文件到环境中。对于比较复杂的项目,可能对应的配置文件有多个,项目在启动部署时会将多个配置文件同时加载进来。

1.可变参数,传入多个文件名
// 同时加载多个资源文件
ApplicationContext ac = newClassPathXmlApplicationContext("spring.xml","dao.xml");
2.通过总的配置文件import其他配置文件
<?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
                      https://www.springframework.org/schema/beans/spring-beans.xsd">
 
  <!--导入需要包含的资源文件-->
  <import resource="service.xml"/>
  <import resource="dao.xml"/>
</beans>
// 加载总的资源文件
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");

三、 Spring IOC 容器 Bean 对象实例化

1.构造器实例化

注:通过默认构造器创建 空构造方法必须存在 否则创建失败

  1. 设置配置文件 spring.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
                          https://www.springframework.org/schema/beans/spring-beans.xsd">
     <bean id="userService"class="com.xxxx.service.UserService"></bean>
    
    </beans>
    
  2. 获取实例化对象

ApplicationContext ac = newClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService)ac.getBean("userService"); 
userService.test();

2.静态工厂实例化(了解)

  1. 定义工厂类及对应的静态方法

  2. 配置bean对象对应的工厂类及静态方法

    id:需要被实例化的bean对象的id

    class:静态工厂类的路径

    factory-method:静态工厂类中实例化bean对象的静态方法

    <bean id="typeService" class="com.xxxx.factory.StaticFactory" factory-method="createService"></bean>
    
    /**
     * 定义静态工厂类
     */
    public class StaticFactory {
    
        /**
         * 定义对应的静态方法
         * @return
         */
        public static TypeService createService() {
    
    
            return new TypeService();
        }
    
    }
    
    TypeService typeService = (TypeService) factory.getBean("typeService");
     typeService.test();
    

3.实例化工厂实例化(了解)

实例化工厂实例化

​ 1. 定义工厂类及对应的方法

​ 2. 配置工厂对象

​ 3. 配置bean对象对应的工厂对象及工厂方法

​ factory-bean:工厂对象对应的id属性值

​ factory-method:工厂类中的方法

 <!-- 工厂对象-->
    <bean id="instanceFactory" class="com.xxxx.factory.InstanceFactory"></bean>
    <!-- bean对象  -->
    <bean id="typeController" factory-bean="instanceFactory" factory-method="createTypeController"></bean>
/**
 * 定义实例化工厂
 */
public class InstanceFactory {

    /**
     * 定义方法
     * @return
     */
    public TypeController createTypeController(){
        return new TypeController();
    }

}

 TypeController typeController = (TypeController) factory.getBean("typeController");
 typeController.test();

4.Spring三种实例化Bean的方式比较

方式一:通过bean的缺省构造函数创建,当各个bean的业务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用。

方式二:利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创建之前需要相同的初始化处理,则可用这个factory方法险进行统一的处理等等。

方式三:利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,1可用于集成其他框架的bean创建管理方法,2能够使bean和factory的角色互换。

四、 Spring IOC 注入

在这里插入图片描述

在这里插入图片描述

图二中对于 UserDao 对象的创建并没有像图一那样主动的去实例化,而是通过带参方法形式将UserDao 传入过来,从而实现 UserService 对UserDao类 的依赖。

而实际创建对象的幕后对象即是交给了外部来创建。

1.Spring IOC 手动装配(注入)

set方法注入

1.属性字段提供set方法

2.在配置文件中通过property属性指定属性字段

四种方式,推荐使用set方法注入

1.业务对象 JavaBean

属性字段提供set方法

public class UserService {
  // 业务对象UserDao set注入(提供set方法)
  private UserDao userDao;
  public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
 }
}

配置文件的bean标签设置property标签

<!--
    IOC通过property标签手动装配(注入):
      Set方法注入
        name:bean对象中属性字段的名称
        ref:指定bean标签的id属性值
  -->
 <bean id="userDao"class="com.xxxx.dao.UserDao"></bean>
	<bean id="userService"class="com.xxxx.service.UserService">
    <!--业务对象 注入-->
     <property name="userDao"ref="userDao"/>
	</bean>
2.常用对象和基本类型

属性字段提供set方法

public class UserService {
  // 常用对象String set注入(提供set方法)
  private String host;
  public void setHost(String host) {
    this.host = host;
 }
  // 基本类型Integer  set注入(提供set方法)
  private Integer port;
  public void setPort(Integer port) {
    this.port = port;
 }
}
<!--
    IOC通过property标签手动装配(注入):
      Set方法注入
        name:bean对象中属性字段的名称
        value:具体的值(基本类型 常用对象|
日期 集合)
  -->
<bean id="userService"class="com.xxxx.service.UserService">
    <!--常用对象String 注入-->
    <property name="host" value="127.0.0.1"/>
    <!--基本类型注入-->
    <property name="port" value="8080"/>
</bean>

集合类型和属性对象

public class UserService {
  // List集合 set注入(提供set方法)
  public List<String> list;
  public void setList(List<String> list) {
    this.list = list;
 }
  // Set集合 set注入(提供set方法)
  private Set<String> set;
  public void setSet(Set<String> set) {
    this.set = set;
 }
  // Map set注入(提供set方法)
  private Map<String,Object> map;
  public void setMap(Map<String, Object>map) {
    this.map = map;
 }
 
  // Properties set注入(提供set方法)
  private Properties properties;
  public void setProperties(Propertiesproperties) {
    this.properties = properties;
 }
}
<!--
    IOC通过property标签手动装配(注入):
      Set方法注入
        name:bean对象中属性字段的名称
        value:具体的值(基本类型 常用对象|
日期 集合)
  -->
<!--List集合 注入-->
  <property name="list">
    <list>
      <value>上海</value>
      <value>北京</value>
      <value>杭州</value>
    </list>
  </property>
  <!--Set集合注入-->
  <property name="set">
    <set>
      <value>上海SH</value>
      <value>北京BJ</value>
      <value>杭州HZ</value>
    </set>
  </property>
  <!--Map注入-->
  <property name="map">
    <map>
      <entry>
        <key><value>周杰伦</value></key>
        <value>我是如此相信</value>
      </entry>
      <entry>
        <key><value>林俊杰</value></key>
        <value>可惜没如果</value>
      </entry>
      <entry>
        <key><value>陈奕迅</value></key>
        <value>十年</value>
      </entry>
    </map>
  </property>
  <!--Properties注入-->
  <property name="properties">
    <props>
      <prop key="上海">东方明珠</prop>
      <prop key="北京">天安门</prop>
      <prop key="杭州">西湖</prop>
    </props>
  </property>

测试

public class UserService {
  // 业务对象UserDao set注入(提供set方法)
  private UserDao userDao;
  public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
 }
  // 常用对象String set注入(提供set方法)
  private String host;
  public void setHost(String host) {
    this.host = host;
 }
  // 基本类型Integer  set注入(提供set方法)
  private Integer port;
  public void setPort(Integer port) {
    this.port = port;
 }
  // List集合 set注入(提供set方法)
  public List<String> list;
  public void setList(List<String> list) {
    this.list = list;
 }
  // List集合输出
  public void printList() {
    list.forEach(s ->System.out.println(s));
 }
  // Set集合 set注入(提供set方法)
  private Set<String> set;
  public void setSet(Set<String> set) {
    this.set = set;
 }
  // Set集合输出
  public void printSet() {
    set.forEach(s -> System.out.println(s));
 }
  // Map set注入(提供set方法)
  private Map<String,Object> map;
  public void setMap(Map<String, Object> map)
{
	this.map = map;
 }
  // Map输出
  public void printMap() {
      map.forEach((k,v) ->System.out.println(k + "," + v));
                         }
  // Properties set注入(提供set方法)
  private Properties properties;
  public void setProperties(Properties properties) {
    this.properties = properties;
 }
  // Properties输出
  public  void printProperties(){
    properties.forEach((k,v) -> System.out.println(k + ","+ v ));
 }
  public  void  test(){
    System.out.println("UserService Test...");
    userDao.test();
    studentDao.test();
    System.out.println("Host:" + host  + ",port:" + port);
    // List集合
    printList();
    // Set集合
    printSet();
    // Map
    printMap();
    // Properties
    printProperties();
 }
}
<!--
    IOC通过property标签手动装配(注入):
      Set方法注入
        name:bean对象中属性字段的名称
        ref:指定bean标签的id属性值
        value:具体的值(基本类型 常用对象|日
期 集合)
  -->
  <bean id="userDao"class="com.xxxx.dao.UserDao"></bean>
  <bean id="userService"class="com.xxxx.service.UserService">
    <!--业务对象 注入-->
    <property name="userDao" ref="userDao"/>
    <property name="studentDao"ref="studentDao"/>
    <!--常用对象String 注入-->
    <property name="host"value="192.168.1.109"/>
    <!--基本类型注入-->
    <property name="port" value="8080"/>
    <!--List集合 注入-->
    <property name="list">
      <list>
        <value>上海</value>
        <value>北京</value>
        <value>杭州</value>
      </list>
    </property>
    <!--Set集合注入-->
    <property name="set">
      <set>
        <value>上海SH</value>
        <value>北京BJ</value>
        <value>杭州HZ</value>
      </set>
    </property>
    <!--Map注入-->
    <property name="map">
      <map>
        <entry>
        <key><value>周杰伦</value></key>
          <value>我是如此相信</value>
        </entry>
        <entry>
          <key><value>林俊杰</value></key>
          <value>可惜没如果</value>
        </entry>
        <entry>
          <key><value>陈奕迅</value></key>
          <value>十年</value>
        </entry>
      </map>
    </property>
    <!--Properties注入-->
    <property name="properties">
      <props>
        <prop key="上海">东方明珠</prop>
        <prop key="北京">天安门</prop>
        <prop key="杭州">西湖</prop>
      </props>
    </property>
  </bean>
构造器注入

提供带参构造器

单个Bean对象作为参数
public class UserService {
  private UserDao userDao; // JavaBean 对象
 
  public UserService(UserDao userDao) {
    this.userDao = userDao;
 }
  public  void  test(){
    System.out.println("UserService
Test...");
    userDao.test();
 }
}
<!--
IOC通过构造器注入:
      通过constructor-arg标签进行注入
        name:属性名称
        ref:指定bean标签的id属性值
  -->
  <bean id="userDao"class="com.xxxx.dao.UserDao" ></bean>
 
  <bean id="userService"class="com.xxxx.service.UserService">
    <constructor-arg name="userDao"ref="userDao"></constructor-arg>
  </bean>
多个Bean对象作为参数
public class UserService {
  private UserDao userDao;  // JavaBean 对象
  private AccountDao accountDao  // JavaBean 对象
   
  public UserService(UserDao userDao,AccountDao accountDao) {
    this.userDao = userDao;
    this.accountDao = accountDao;
 }
  public  void  test(){
    System.out.println("UserService Test...");
	userDao.test();
    accountDao.test();
 }
}
<!--
    IOC通过构造器注入:
      通过constructor-arg标签进行注入
        name:属性名称
        ref:指定bean标签的id属性值
  -->
  <bean id="userDao"class="com.xxxx.dao.UserDao" ></bean>
  <bean id="accountDao"class="com.xxxx.dao.AccountDao" ></bean>
  <bean id="userService"class="com.xxxx.service.UserService">
	<constructor-arg name="userDao"ref="userDao"></constructor-arg>
    <constructor-arg name="accountDao"ref="accountDao"></constructor-arg>
  </bean>
Bean对象和常用对象作为参数
public class UserService {
  private UserDao userDao;  // JavaBean 对象
  private AccountDao accountDao;  // JavaBean对象
  private String uname;  // 字符串类型
   
  public UserService(UserDao userDao,AccountDao accountDao, String uname) {
    this.userDao = userDao;
    this.accountDao = accountDao;
    this.uname = uname;
 }
  public  void  test(){
    System.out.println("UserService Test...");
    userDao.test();
    accountDao.test();
    System.out.println("uname:" + uname);
 }
}
<!--
    IOC通过构造器注入:
      通过constructor-arg标签进行注入
        name:属性名称
        ref:指定bean标签的id属性值
value:基本类型 常用对象的值
        index:构造器中参数的下标,从0开始
  -->
  <bean id="userDao"class="com.xxxx.dao.UserDao" ></bean>
  <bean id="accountDao"class="com.xxxx.dao.AccountDao" ></bean>
  <bean id="userService"class="com.xxxx.service.UserService">
    <constructor-arg name="userDao"ref="userDao"></constructor-arg>
    <constructor-arg name="accountDao"ref="accountDao"></constructor-arg>
	<constructor-arg name="uname"value="admin"></constructor-arg>
  </bean>
循环依赖问题

循环问题产生的原因:

Bean通过构造器注入,之间彼此相互依赖对方导致bean无法实例化。

如何解决:将构造器注入改为set方法注入

静态工厂注入

定义静态工厂类

public class StaticFactory {
  // 定义静态方法
  public static TypeDao createTypeDao() {
    return new TypeDao();
 }
}
public class TypeService {
  private TypeDao typeDao;
  public void setTypeDao(TypeDao typeDao) {
    this.typeDao = typeDao;
 }
  public void  test() {
    System.out.println("TypeService Test...");
 }
}

在配置文件中设置bean标签,指定工厂对象并设置对应的方法

<bean id="typeService"class="com.xxxx.service.TypeService">
<property name="typeDao" ref="typeDao"/>
</bean>
<!--
静态工厂注入:
静态工厂注入也是借助set方法注入,只是被注入的
bean对象的实例化是通过静态工厂实例化的
-->
<bean id="typeDao"class="com.xxxx.factory.StaticFactory" factory-method="createTypeDao"></bean>
实例化工厂注入

定义工厂类

public class InstanceFactory {
  public TypeDao createTypeDao() {
    return new TypeDao();
 }
}
public class TypeService {
  private TypeDao typeDao;
  public void setTypeDao(TypeDao typeDao) {
    this.typeDao = typeDao;
 }
  public void  test() {
    System.out.println("TypeService
Test...");
 }
}

声明工厂bean标签,声明bean对象,指明工厂对象和工厂方法

<bean id="typeService"class="com.xxxx.service.TypeService">
<property name="typeDao" ref="typeDao"/>
</bean>
<!--
实例化工厂注入:
实例化工厂注入也是借助set方法注入,只是被注入
的bean对象的实例化是通过实例化工厂实例化的
-->
<bean id="instanceFactory"class="com.xxxx.factory.InstanceFactory"></bean>
<bean id="typeDao" factory-bean="instanceFactory" factory-method="createTypeDao"></bean>

重点掌握set注入和构造器注入,工厂方式了解即可。实际开发中基本使用set方式注入bean。

2.p名称空间的使用

spring2.5以后,为了简化setter方法属性注入,引用p名称空间的概念,可以将 子元素,简化为元素属性配置。

1.属性字段提供 set 方法
public class UserService {
  // 业务对象UserDao set注入(提供set方法)
  private UserDao userDao;
  public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
 }
 
  // 常用对象String set注入(提供set方法)
  private String host;
  public void setHost(String host) {
    this.host = host;
 }
}
2.在配置文件 spring.xml 引入 p 名称空间
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
  https://www.springframework.org/schema/beans/spring-beans.xsd">
 
<bean id="userDao"class="com.xxxx.dao.UserDao"></bean>
  <!--
		p:属性名:="xxx" 引入常量值
		p:属性名-ref:="xxx" 引入其他Bean对象的
		id属性值
-->
  <bean id="userService"
        class="com.xxxx.service.UserService"
        p:userDao-ref="userDao"
        p:host="127.0.0.1" />
</beans>

3.Spring IOC 自动装配(注入)

注解方式注入 Bean

对于 bean 的注入,除了使用 xml 配置以外,可以使用注解配置。注解的配置,可以简化配置文件,提高开发的速度,使程序看上去更简洁。对于注解的解释,Spring对于注解有专门的解释器,对定义的注解进行解析,实现对应bean对象的注入。通过反射技术实现。

1.准备环境
修改配置文件
<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
 	   https://www.springframework.org/schema/beans/spring-beans.xsd
  	   http://www.springframework.org/schema/context
  	   http://www.springframework.org/schema/context/spring-context.xsd">
开启自动化注入
<!--开启自动化装配(注入)-->
<context:annotation-config/>
<bean id="userDao"class="com.xxxx.dao.UserDao"></bean>
<bean id="userService"class="com.xxxx.service.UserService"></bean>
给注入的bean对象添加注解

2.@Resource注解

@Resource注解实现自动注入 (反射)
  1. 注解默认通过属性字段名称查找对应的bean对象(属性字段名称与bean标签的id属性值一致)
  2. 如果属性字段名称不一样,则会通过类型(Class)类型
  3. 属性字段可以提供set方法 也可以不提供
  4. 注解可以声明在属性字段上 或 set方法级别
  5. 可以设置注解的name属性,name属性值要与bean标签的id属性值一致(如果设置了name属性,则会按照name属性查询bean对象)
  6. 当注入接口时,如果接口只有一个实现类,则正常实例化;如果接口有多个实现类,则需要使用name属性指定需要被实例化的bean对象
代码示例
  1. 默认根据属性字段名称查找对应的bean对象 (属性字段的名称与bean标签的id属性值相等)
/**
* @Resource注解实现自动注入(反射)
* 默认根据属性字段名称查找对应的bean对象 (属性字段的名称与bean标签的id属性值相等)
*/
public class UserService {
  @Resource
  private UserDao userDao; // 属性字段的名称与bean标签的id属性值相等
  public void setUserDao(UserDao userDao) {
  this.userDao = userDao;
 }
  public void test() {
    // 调用UserDao的方法
    userDao.test();
 }
}
  1. 如果属性字段名称未找到,则会通过类型(Class类型)查找
/**
* @Resource注解实现自动注入(反射)
*  如果属性字段名称未找到,则会通过类型(Class类型)查找
*/
public class UserService {
  @Resource
  private UserDao ud; // 当在配置文件中属性字段名(ud)未找到,则会查找对应的class(UserDao类型)
  public void setUd(UserDao ud) {
   	this.ud = ud;
 }
  public void test() {
    // 调用UserDao的方法
    ud.test();
  }
}
  1. 属性可以提供set方法,也可以不提供set方法
/**
* @Resource注解实现自动注入(反射)
*  属性可以提供set方法,也可以不提供set方法
*/
public class UserService {
  @Resource
  private UserDao userDao; // 不提供set方法
  public void test() {
    // 调用UserDao的方法
    userDao.test();
 }
}
  1. 注解可以声明在属性级别 或 set方法级别
/**
* @Resource注解实现自动注入(反射)
*  注解可以声明在属性级别 或 set方法级别
*/
public class UserService {
  private UserDao userDao;
  @Resource // 注解也可设置在set方法上
  public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
 }
  public void test() {
  // 调用UserDao的方法
    userDao.test();
 }
}
  1. 可以设置name属性,name属性值必须与bean标签的id属性值一致;如果设置了name属性值,就只会按照name属性值查找bean对象
/**
* @Resource注解实现自动注入(反射)
*  可以设置name属性,name属性值必须与bean的id属性
值一致;
*  如果设置了name属性值,就只会按照name属性值查找
bean对象
*/
public class UserService {
  @Resource(name = "userDao") // name属性值与
配置文件中bean标签的id属性值一致
  private UserDao ud;
  public void test() {
    // 调用UserDao的方法
    ud.test();
 }
}
  1. 当注入接口时,如果接口只有一个实现则正常实例化;如果接口存在多个实现,则需要使用name属性指定需要被实例化的bean对象

    定义接口类 IUserDao.java

package com.xxxx.dao;
/**
* 定义接口类
*/
public interface IUserDao {
  public void test();
}
package com.xxxx.dao;
/**
* 接口实现类
*/
public class UserDao01 implements IUserDao {
  @Override
  public void test(){
    System.out.println("UserDao01...");
 }
}
package com.xxxx.dao;
/**
* 接口实现类
*/
public class UserDao02 implements IUserDao {
  @Override
  public void test(){
    System.out.println("UserDao02...");
 }
}
<!--开启自动化装配(注入)-->
<context:annotation-config/>
<bean id="userService"class="com.xxxx.service.UserService"></bean>
<bean id="userDao01"class="com.xxxx.dao.UserDao01"></bean>
<bean id="userDao02"class="com.xxxx.dao.UserDao01"></bean>
/**
* @Resource注解实现自动注入(反射)
*  当注入接口时,如果接口只有一个实现则正常实例化;
如果接口存在多个实现,则需要使用name属性指定需要被实例
化的bean对象
*/
public class UserService {
@Resource(name = "userDao01") // name属性值与其中一个实现类的bean标签的id属性值一致
  private IUserDao iUserDao; // 注入接口(接口存在多个实现)
  public void test() {
    iUserDao.test();
 }
}

3.@Autowired注解

@Autowired注解实现自动化注入

  1. 注解默认使用类型(Class类型)查找bean对象,与属性字段名称没有关系
  2. 属性字段可以提供set方法 也可以不提供
  3. 注解可以声明在属性级别 或 set方法级别
  4. 如果想要通过指定名称查找bean对象,需要结合@Qualifier使用(通过设置value属性值查找,value属性值要bean标签的id属性值保持一致)

默认通过类型(Class类型)查找bean对象 与属性字段的名称
无关

/**
* @Autowired注解实现自动化注入
* 默认通过类型(Class类型)查找bean对象  与属性字
段的名称无关
*/
public class UserService {
  @Autowired
   private UserDao userDao; // 默认通过类型(Class类型)查找bean对象 与属性字段的名称无关
  public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
 }
  public void test() {
    // 调用UserDao的方法
    userDao.test();
 }
}

属性可以提供set方法,也可以不提供set方法

/**
* @Autowired注解实现自动化注入
* 属性可以提供set方法,也可以不提供set方法
*/
public class UserService {
  @Autowired
  private UserDao userDao; // 不提供set方法
  public void test() {
    // 调用UserDao的方法
    userDao.test();
 }
}

注解可以声明在属性级别 或 set方法级别

/**
* @Autowired注解实现自动化注入
* 注解可以声明在属性级别 或 set方法级别
*/
public class UserService {
private UserDao userDao;
  @Autowired// 注解可以声明在set方法级别
  public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
 }
  public void test() {
    // 调用UserDao的方法
    userDao.test();
 }
}

可以添加@Qualifier结合使用,通过value属性值查找bean对(value属性值必须要设置,且值要与bean标签的id属性值对应)

/**
* @Autowired注解实现自动化注入
* 可以添加@Qualifier结合使用,通过value属性值查找
bean对象
value属性值必须要设置,且值要与bean标签的id
属性值对应
*/
public class UserService {
  @Autowired
  @Qualifier(value="userDao") // value属性值必须要设置,且值要与bean标签的id属性值对应
  private UserDao userDao;
  public void test() {
    userDao.test();
 }
}

推荐使用@Resource 注解是属于J2EE的,减少了与Spring的耦合。

五、Spring IOC 扫描器

实际的开发中,bean的数量非常多,采用手动配置bean的方式已无法满足生产需要,Spring这时候同样提供了扫描的方式,对扫描到的bean对象统一进行管理,简化开发配置,提高开发效率。

作用:bean对象统一进行管理,简化开发配置,提高开发效率

1.Spring IOC 扫描器的配置

设置自动化扫描的范围:如果bean对象未在指定包范围,即使声明了注解,也无法实例化

使用指定的注解(声明在类级别):bean对象的id属性默认是 类的首字母小写

Dao层: @Repository

Service层: @Service

Controller层: @Controller

任意类: @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
https://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="com.xxxx"/>
</beans>

2.使用特定的注解

@Repository (Dao层)
@Repository
public class ResourceDao {
  public void  test() {
    System.out.println("ResourceDao...");
 }
}
@Service(Service层 )
@Service
public class ResourceService {
  @Resource
  private ResourceDao resourceDao; //service层注入dao层的bean对象
  public  void  test() {
  
 System.out.println("ResourceService...");
    resourceDao.test();
 }
}
@Controller (Controller 层 )
@Controller
public class ResourceController {
  @Autowired
  private ResourceService resourceService;
// Controller层注入service层的bean对象
  public  void  test() {
  
 System.out.println("ResourceController...");
    resourceService.test();
 }
}
@Component (任意层)
@Component
public class PropertyUtils {
  public void test(){
    System.out.println("PropertyUtils...");
 }
}

六、Bean的作用域与生命周期

1.Bean的作用域

默认情况下,我们从Spring容器中拿到的对象均是单例的,对于bean的作用域类型如下:

在这里插入图片描述

注意: lazy-init是懒加载, 如果等于true时作用是指Spring容器启动的时候不会去实例化这个bean, 而是在程序调用时才去实例化. 默认是false即Spring容器启动时实例化.

默认情况下,被管理的bean只会IOC容器中存在一个实例,对于所有获取该Bean的操作Spring容器将只返回同一个Bean。

singleton作用域(单例作用域)

Spring IOC容器在启动时,会将所有在singleton作用域中的bean对象实例化,并设置到单例缓存池中

lazy-init属性(懒加载)

​ 如果设置为true,表示懒加载,容器在启动时,不会实例化bean对象,在程序调用时才会实例化

​ 如果设置false(默认),表示不懒加载,容器启动则实例化bean对象

lazy-init属性为什么要设置为false?

​ 1. 可以提前发现潜在的配置文件

​ 2. Bean对象在启动时就会设置在单例缓存池中,使用时不需要再去实例化bean对象,提高程序运行效率

什么对象适合作为单例对象?(什么对象适合交给IOC容器实例化?)

​ 无状态的对象(不存在改变当前对象状态的成员变量)

​ 使用对象:controller层、service层、dao层

什么是无状态或状态不可改变的对象?

实际上对象状态的变化往往均是由于属性值得变化而引起的,比如user类 姓名属性会有变化,属性姓名的变化一般会引起user对象状态的变化。对于我们的程序来说,无状态对象没有实例变量的存在,保证了线程的安全性,service 层业务对象即是无状态对象。线程安全的。

   <!-- singleton作用域 -->
        <!-- 懒加载 -->
        <bean id="roleService" class="com.xxxx.service.RoleService" lazy-init="true"></bean>
        <!-- 默认是false,不懒加载 -->
       <bean id="roleService" class="com.xxxx.service.RoleService" lazy-init="false"></bean>

prototype 作用域(原型作用域)

在这里插入图片描述

通过scope=“prototype” 设置bean的类型 ,每次向Spring容器请求获取Bean都返回一个全新的Bean,相对于"singleton"来说就是不缓存Bean,每次都是一个根据Bean定义创建的全新Bean。

<bean id="roleService" class="com.xxxx.service.RoleService" scope="prototype"></bean>
Web应用中的作用域

request作用域:表示每个请求需要容器创建一个全新Bean。

session作用域:表示每个会话需要容器创建一个全新Bean。

globalSession作用域

2.Bean的生命周期

对比已经学过的servlet 生命周期(容器启动装载并实例化servlet类,初始化servlet,调用service方法,销毁servlet)。

在Spring中,Bean的生命周期包括Bean的定义、初始化、使用和销毁4个阶段

Bean的定义

​ 在配置文件中定义bean

​ 通过bean标签定义对应bean对象

Bean的初始化

​ IOC容器启动时,自动实例化Bean对象

​ 1. 在配置文档中通过指定 init-method 属性来完成。

​ 2. 实现 org.springframework.beans.factory.InitializingBean 接口。

Bean的使用

​ 1. 使用 BeanFactory对象

​ 2. 使用 ApplicationContext对象

Bean的销毁

​ 步骤一:通过 AbstractApplicationContext 对象,调用其close方法实现bean的销毁过程

​ 步骤二:在配置文件中指定对应销毁的方法 destroy-method

		 <!--  Bean的初始化:在配置文档中通过指定 init-method 属性来完成-->
        <bean id="roleService" class="com.xxxx.service.RoleService" init-method="init"></bean>
        <!-- Bean的初始化:实现 org.springframework.beans.factory.InitializingBean 接口 -->
        <bean id="roleService" class="com.xxxx.service.RoleService" ></bean>

        <!-- Bean的销毁 -->
        <bean id="roleService" class="com.xxxx.service.RoleService" destroy-method="destroy" ></bean>
        // 通过 AbstractApplicationContext 对象,调用其close方法实现bean的销毁过程
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("spring03.xml");
        System.out.println("销毁前:" + ctx.getBean("roleService"));
        ctx.close();
        System.out.println("销毁后:" + ctx.getBean("roleService"));

IOC/DI-控制反转和依赖注入 将对象实例化的创建过程转交给外部容器(IOC容器 充当工厂角色)去负责;属性赋值的操作;

Spring中的IoC的基本概念及实现原理 本篇文章内容基于《Spring 5企业级开发实战》。 1. IoC的概念 1.1依赖倒置原则 1.2依赖注入 2. Spring IoC的实现方式 2.1 XML方式 2.2注解方式 3. Spring IoC实现原理解析 3.1 BeanFactory代码解析 3.2 ApplicationContext代码解析 3.3 BeanDefinition代码解析 3.4 ... 阅读详情

相关推荐

告别绕线!用Altium Designer从零设计一个PCB平面变压器(附3D模型)

本文详细介绍了如何使用Altium Designer从零设计一个PCB平面变压器,包括磁芯选型、电气参数计算、PCB设计实战技巧以及3D验证与生产输出。通过将绕组直接集成到PCB层中,配合嵌入式磁芯,实现了小型化、高功率密度的电源设计,适用于中低电流、高频应用场景。附3D模型,帮助读者快速掌握这一创新设计流程。

weixin_33716154的博客 442

Spring中IOC详解

一、IOC的原型 IOC ----控制反转 比如我们有一个功能是获取用户数据,我们使用Dao层实现这个功能,再在Service层调用这个功能。但是我们每增加一个接口,比如获取mysql中的数据,就要修改原来的代码,如果再增加一个新的接口,又需要去service实现类中修改对应的实现。 解决方法 用户实际调用的是业务层,dao层他们不需要接触 UserServiceImpl userService = new UserServiceImpl(); userSe

qq_41359998的博客 1万+

【COMSOL超材料和超表面仿真设计】

超材料和超表面的设计通常需要自定义材料属性。在COMSOL中,可以通过定义介电常数和磁导率的张量来模拟超材料的特性。对于超表面,通常需要定义表面阻抗或等效电路模型。

weixin_51101456的博客 1662

Spring中的IOC详解

单例Bean和多实例Bean的生命周期主要区别在于实例化和销毁的管理方式,单例Bean在容器启动时创建一个实例,并由容器负责管理其生命周期的完整过程。在Spring框架中,Bean是应用程序的核心组件,它们由Spring容器创建、组装和管理,以帮助开发者实现松耦合、可测试和可维护的代码。IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。Bean的自动装配是Spring框架提供的一种便捷的方式,用于自动解析和设置Bean之间的依赖关系,而无需显式配置每一个依赖关系的方式。

努力分享一些干货 8635

从零到一:TI AWR1843 Boost EVM与DCA1000 EVM的ADC数据采集实战指南

本文详细介绍了TI AWR1843 Boost EVM与DCA1000 EVM的ADC数据采集实战指南,涵盖硬件连接、软件配置、固件烧录、雷达参数设置及数据处理等关键步骤。通过MATLAB等工具,开发者可高效实现毫米波雷达数据采集,适用于自动驾驶、工业检测等领域。

weixin_29001327的博客 966

第七天 Labview进阶(7.4 NI Vision简单使用)

NIVision机器视觉软件使用指南 摘要:NIVision是National Instruments推出的高效机器视觉软件,具有硬件无缝集成、图形化编程和工业级部署等优势。本文介绍了NIVision的安装步骤(需Vision Acquisition和Vision Development模块)及三个典型应用案例:1)实物检测通过IMAQCreate等模块实现物体识别与坐标定位;2)OCR检测利用IMAQOCR系列模块完成字符识别;3)几何模板匹配使用IMAQLearnGeometricPattern等模块实

weixin_38637405的博客 771

SpringIOC机制详解

所谓Bean的作用域其实就是指Spring给我们创建出的对象的存活范围,在配置文件中通过bean的scope属性指定取值范围说明singleton默认值,单例的prototype多例的requestWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中sessionWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中。

互联网底层民工的博客 9561

华为OD机试真题 新系统2026-04-01 Java&Go 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 617

Spring IoC详解

Spring 是一个开源的Java框架,它提供了丰富的功能和组件,用于简化企业级应用程序的开发。Spring 框架提供了依赖注入、面向切面编程、事务管理、数据访问等功能,是一个全面的企业应用开发解决方案。Spring MVC 是 Spring 框架中的一个模块,即Spring功能的一部分,用于构建 Web 应用程序的 MVC(Model-View-Controller)架构。Spring MVC 提供了基于注解的方式来定义控制器、处理请求和渲染视图,使得开发 Web 应用程序更加简单和灵活。

2303_78892316的博客 5008

vue2/3 - element表格组件el-table实现懒加载树型(上下级)数据、默认展开和隐藏层级,支持对表格进行修改|新增|删除,解决完成操作后树节点不刷新问题(提供示例代码,一键复制开箱即用

vue2,vue3,elementui,elementPlus,el-table,Table表格组件,表格懒加载数据,element table表格数中的树形结构懒加载,增加后数据不同步更新问题,el-table树形与el-tree树形结构的一键折叠与展开,elementui中el-tree懒加载数据 默认展开最外层节点,Element-plus Table组件树表结构默认展开一级目录,vue实现element table表格树形结构-使用懒加载时-解决子节点增删改后,不刷新子节点数据问题,解决el-tre

✅ 精选推荐文章 1万+

使用PyTorch和TextCNN实现英文长文本诗歌文本分类

在这个过程中,我们了解了如何进行文本数据预处理、构建TextCNN模型,并进行训练与评估。首先,我们需要将文本文件加载到内存中,并将每个诗歌作为一个样本。然后,我们需要将每个样本转换为数字表示,这可以通过将词汇表中的每个词语映射到一个唯一的整数来实现。此外,我们还需要将每个样本的长度统一为固定值,以便于模型输入。通过这个示例,我们可以学习如何构建一个简单但有效的文本分类模型,并在具体的应用场景中进行训练和预测。该模型通过使用多个不同尺寸的卷积核来捕捉文本中的不同长度的信息,并通过最大池化操作提取关键特征。

loop_syntax648的博客 254

Spring框架(IOC)

一、什么是 IOC (1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理 (2)使用 IOC 目的:为了耦合度降低 二、IOC 底层原理 xml 解析、工厂模式、反射 三、IOC过程 xml解析帮助我们得到xml文件中我们需要的属性值 利用这个属性值配和下面的class类的两个方法创建出我们需要的对象(返回前做类型强转) 三、BeanFactory 接口 IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂 Spring 提供 IOC 容器实现两种方式:(两个接口)

eyvr的博客 4204

YOLOv26详解 | 一文带你从代码角度深入理解ultralytics最新作品yolov26的创新 | 训练、推理、验证、导出 (附网络结构图PPT可用,全网最全)

YOLOv26带来多项创新:1)采用双检测头机制(One-to-Many和One-to-One)实现端到端无NMS推理;2)移除DFL简化边界框回归;3)引入ProgLoss+STAL优化小目标检测;4)使用MuSGD优化器提升训练稳定性。网络结构方面,SPPF模块增加shortcut连接,并在C3k2中引入PSABlock注意力机制。该版本更注重实际部署,简化了推理流程,提升硬件兼容性。教程涵盖模型训练、验证、推理及导出全流程,支持多种格式转换如ONNX、TensorRT等,适合工业应用场景。

Snu77的博客 4064

Spring 揭秘之IoC的基本概念

《Spring 揭秘》读书笔记之第二章 IoC的基本概念 文章目录《Spring 揭秘》读书笔记之第二章 IoC的基本概念IoC的理念DI的三种方式Setter注入Constructor注入Interface注入IoC的附加值 IoC的理念 IoC,全称Inversion of Control。理解IoC,需要理解两个词:Inversio和Control。 实际上,IoC作为一种理念,不仅存在于编...

博采众长,自成一派; 763

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深度学习工具包 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 基本概念及ioc操作

Spring 的 基本概念 1、Spring 是一种 开源的、轻量级的框架 2、Spring 的 两个核心 (1)aop :面向切面编程,扩展功能不是修改源代码实现。 (2)ioc :控制反转。 -对象创建,不是通过new 的方式实现,而是交给Spring 配置创建类的对象 3、Spring 是一种一站式框架 (1)Spring 在 JavaEE 三层框架结构中,每一层都提供不同的解决技术 we...

weixin_41644248的博客 145

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring 基本概念和 IOC

Spring 基本概念1 spring是开源的轻量级框架2 spring核心主要两部分: (1)aop:面向切面编程,扩展功能不是修改源代码实现 (2)ioc:控制反转,把对象的创建交给spring进行管理 - 比如有一个类,在类里面有方法(不是静态的方法),调用类里面的方法,创建类的对象,使用对象调用方法,创建类对象的过程,需要new出来对象 - 把对象的创建不是通过new方式实现,而是交

请叫我王老魔 484

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring Ioc的基本概念,创建ApplicationContext的三种方式

2.1 Spring Ioc的基本概念 控制反转是一个比较抽象的概念,用于消减计算机应用程序的耦合性,依赖注入是Ioc的另外一种说法。 传统编程模式下,如果一个Java对象要调用另一个Java对象,我们通常选择”new 被调用的对象“,这样的模式会增加程序的耦合性,不利于后期代码的维护和升级。 2.2 Spring Ioc容器 实现控制反转主要是BeanFactory和Applicationcontext两个接口。 2.2.1 BeanFactory BeanFactory是一个管理Bean的工厂,该类会根

qq_48886692的博客 1303

Spring 源码解读:手动实现IoC容器的基本概念与职责

本篇文章将带你从零开始手动实现一个自定义IoC容器,理解IoC的基本概念和工作原理,并与Spring源码进行对比。而IoC则通过将对象的创建和管理交给容器,从而实现了控制的反转。我们的自定义IoC容器实现虽然简单,但它帮助我们理解了Spring IoC容器的基本原理。在这一部分,我们将详细解读Spring中与我们自定义IoC容器功能对应的源码,帮助你理解Spring是如何实现这些功能的。为了更好地理解IoC容器的工作原理,我们将手动实现一个简单的IoC容器。来管理Bean的生命周期和依赖注入的。

捕风捉你 · 星桥API接入与大模型实战 1145

Spring IoC的基本概念

Ioc基本概念#控制反转三种依赖注入(DI)方式构造注入setter方法注入接口注入 #控制反转 通常情况下,被注入对象会直接依赖于被依赖对象。但是,在IoC的场景中,二者之间通过IoC Service Provider来打交道,所有的被注入对象和依赖对象现在由IoC Service Provider统一管理。 被注入对象需要什么,直接跟IoC Service Provider招呼一声, 后者就会把相应的被依赖对象注入到被注入对象中,从而达到IoC Service Provider为被注入对象服务的目的。

qq_38022739的博客 209

spring ioc基本概念和理解

IOC,控制反转,但是从我的角度和理解来看,就是由主动变为被动,举个简单的例子:就是本来我是老大,一切的主动权在我的手里,我来操控一切,后来过来一位比我级别更高的领导,转由他来进行操控,我想这就比较容易理解这个概念了,属于角色互换,控制反转。 控制反转:是一种通过描述(在java中可以通过xml方式和注解的方式)并通过第三方去产生或获取特定对象的方式。 在spring中实现控制反转的ioc容器...

crossroads10的博客 1505

Spring--IOC、DI和AOP的基本概念和实现步骤

在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。

m0_71796330的博客 1232

Spring简介之基本概念 AOP、IOC

1、基本概念理解 AOP:Aspect Oriented Programming:面向切面编程 OOP:Object Oriented Programming:面向对象编程 话不多说直接上图 为一些OOP 对象加入一些统一的方法 横切开 一些封装好的对象 ,将对 一些公共的与业务关系不大的 整理成一个可重用模块,并将其名为“Aspect”,即方面。横切关注点的一个特点是,他们经常发生在核心关注点...

老羡的博客 270

基本概念之Spring IOC和DI简介

文章目录基本概念之Spring IOC和DI简介1. IOC(控制反转)2. DI(依赖注入)3. Spring IOC与DI4. 拓展4.1 DL(依赖查找) 基本概念之Spring IOC和DI简介 参考地址: IoC基础 1. IOC(控制反转) IOC:Inversion of Control,即控制反转,不是一种技术而是一种设计思想。在java开发过程中,IOC意味着将你设计好的对象交给容器来创建和管理,而不是在对象内部直接创建和管理。 IOC的关键就是要了解下面三点: 谁控制谁,具体控

bigdata-page 235

Spring IOC容器--基本概念

IOC容器接口: BeanFactory package org.springframework.beans.factory; import org.springframework.beans.BeansException; import org.springframework.core.ResolvableType; import org.springframework.lang.Null...

zhuchj的博客 320

Spring IOC的基本概念,IoC容器的实现方式有哪些?

Spring IOC的基本概念,IoC容器的实现方式有哪些?

javamyfriend的博客 579
上一篇: Jsp和Jstl
下一篇: Spring AOP
地球魔
博客等级 码龄6年 317粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值