了解Spring、Spring IOC

死磕Spring之IoC篇 - 深入了解Spring IoC(面试题) 目录 1. 什么是 Spring Framework ? 2. Spring Framework 的优势和不足? 3. 你对 IoC 的理解? 4. 为什么需要 IoC ? 5. IoC 和 DI 的区别? 6. IoC 容器的职责? 7. 什么是 Spring IoC 容器? 8. 构造器注入和 Setter 注入 9. BeanFactory 和 ApplicationContext 谁才是 Spring IoC 容器? 10. Spring Bean 的生命周期? 11. Bea 阅读详情

Spring、

Spring简介

​ Spring框架是一个开源的JavaEE应用程序,两大核心思想就是IOC(控制反转),DI(依赖注入),AOP(面向切面编程)

​ Spring IOC

​ Spring AOP

​ Spring JDBC+事务

​

Spring的作用

​ Dao层

​ JDBC处理(BaseDao)

​ 对应框架:MyBatis

​ Service层

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

​ Web层(Controller层)

​ Servlet(接收参数 响应数据 地址配置 页面转发)

​ 对应框架:SpringMVC

​

​ Spring框架是基于分布式的应用程序

​ 属于轻量级的框架

​ 配置管理

​ Bean对象实例化-IOC

​

​ 集成其他的第三方技术

​ MyBatis、Hibernate框架(持久层框架)

​ SpringMVC

​ Spring Security权限

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

​ 自带服务

​ Mail邮件处理

​ 定时任务处理-定时调用(例:定时任务,定时短信)

​ 消息处理(异步处理)

Spring模块划分

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

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

​ Spring JDBC+事务模块

​ Spring Web模块

spring环境搭建

1、先创建Maven项目

​ 选择"File"——>选择"New"——>选择Maven

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G0rb0wx9-1592133690573)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591777363897.png)]

2、设置项目的坐标和名字

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgTehrj1-1592133690576)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591777557461.png)]

3、设置项目的Maven环境

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fhTNpgL2-1592133690578)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591777945702.png)]

4、设置项目的名称和存放工作空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AYzUZSBh-1592133690580)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591778070792.png)]

5、修改项目中pom.xml的配置

5.1修改jdk版本
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
</properties>
5.2修改单元测试的版本
<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
</dependency>
5.3删除 build标签中的pluginManagement标签
 <build>
    <!--删除 build标签中的pluginManagement标签-->
  </build>
5.4添加sping依赖坐标

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

<!--添加 Spring 依赖坐标-->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
 <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-context</artifactId>
     <version>4.3.10.RELEASE</version>
 </dependency>

6、添加Spring的配置文件spring.xml

6.1在项目的src下创建文件夹(Alt+insert)

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TxwgGnJC-1592133690582)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591833799221.png)]

6.2将文件夹标准为资源目录

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWscRxNy-1592133690584)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591833948628.png)]

6.3新建xml文件,将官方文档上的配置拷贝到文件中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kfk72QRH-1592133690585)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591834167775.png)]

<?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="userServices" class="com.shsxt.services.UserServices"></bean>

</beans>

7、创建Bean对象

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hvlCmiY-1592133690586)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591834513248.png)]

8、通过spring.xml配置Bean对象

 		<bean id="userServices" class="com.shsxt.services.UserServices"></bean>

9、加载配置文件,获取实例化对象

public static void main(String[] args) {
    			  //获取到spring上下环境
     			 ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
     			 //通过get Bean()方法得到Spring实例化的Bean对像
     			 UserServices userServices= (UserServices) ac.getBean("userServices");
     			 userServices.test();

 			 }

对象实例化模拟实现

1、通过构造器得到相关的配置文件
2、通过dom4j解析xml文件,得到List 存放id和class
3、通过反射实例化得到对象 class.forName(类的全路径).newInstance(); 通过Map(id,class)来存储
4、得到指定实例化的对象

实现步骤:

1、创建接口 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uL5ueTCT-1592133690587)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591867286034.png)]
2、向pom.xml添加Dom4j坐标依赖
		 <!--添加dom4j的坐标依赖-->
    		<dependency>
     		 	<groupId>dom4j</groupId>
      			<artifactId>dom4j</artifactId>
      			<version>1.6.1</version>
    		</dependency>
    		<dependency>
     			 <groupId>jaxen</groupId>
      			<artifactId>jaxen</artifactId>
      			<version>1.1.6</version>
    		</dependency>
3、编写实现代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9dImVlP-1592133690588)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591867329070.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eUwH8ncw-1592133690589)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591867353152.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c7ojeuTH-1592133690590)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591867369517.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gD0i1F1j-1592133690591)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591867379194.png)]

4、测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wNJTCbgA-1592133690592)(C:\Users\china\AppData\Roaming\Typora\typora-user-images\1591867426284.png)]

Spring IOC核心技术

​ 工厂设计模式(简单工厂 工厂方法 抽象方法)

​ XML解析(Dom4j Xpath)

​ 反射(实例化对象 反射获取方法 反射获取属性 反射获取构造器)

​ 策略模式(加载资源)

​ 单例(IOC创建的实例化对象都是单例)

Spring IOC配置文件的加载方式

根据相对路径加载资源文件
ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
根据绝对路径加载资源文件(了解)
ApplicationContext ac=new FileSystemXmlApplicationContext("D:\\java\\idea_work\\spring02\\src\\main\\resources\\spring.xml");
同时加载多个资源文件

​ 可变参数,传入多个文件名

//同时加载多个资源文件
ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml","dao.xml");

通过总的配置文件import配置其他文件

​ total.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">
    <!--导入需要包含的资源文件-->
    <import resource="dao.xml"></import>
    <import resource="spring.xml"></import>
</beans>

​ 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="userServices" class="com.shsxt.services.UserServices">
        <!-- collaborators and configuration for this bean go here -->
    </bean>


</beans>

​ dao.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="userDao" class="com.shsxt.dao.UserDao"></bean>
</beans>
2、加载总的资源文件
//加载总的资源文件
ApplicationContext ac=new ClassPathXmlApplicationContext("total.xml");

Spring IOC 对象实例化

构造器实例化

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

ApplicationContext ac=new ClassPathXmlApplicationContext("spring.xml");
//通过getBean()方法得到实例化对象
//userFactory代表的是配置文件中bean标签的id属性
UserServices userServices= (UserServices) ac.getBean("userServices");
//方法调用
userServices.test();
 <bean id="userServices" class="com.shsxt.services.UserServices">
静态工厂实例化(了解)
<!--静态工厂-->
<bean   id="userFactory" class="com.shsxt.factory.UserFactory" factory-method="test"></bean>
实例化工厂实例化(了解)
<!--实例化工厂 
1.定义实例化工厂 bean 
2.引用工厂 bean 指定工厂创建方法(方法为非静态) -->
<bean id="instanceFactory" class="com.shsxt.factory.InstanceFactory"></bean> 
<bean id="userService" factory-bean="instanceFactory" factorymethod="createUserService"></bean>
Spring三种实例化bean的方式比较

​ 方式一:通过bean 的缺省构造函数创建,当各个bean的业务逻辑相互比较独立的时候 或者和外界关联较少的时候可以使用。
​ 方式二:利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创 建之前需要相同的初始化处理,则可用这个factory方法险进行统一的处理等等。
​ 方式三:利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,
1可用于集成其他框架的bean创建管理方法,2能够使bean和factory的角色互换。

Spring IOC 注入(DI)

手动注入
set(方法)注入
1、属性字段都要提供set方法
		//业务对象UserDao   set注入
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    //常用对象String set注入
    private String host;
    public void setHost(String host) {
        this.host = host;
    }
    //基本类型Integer set注入
    private Integer port;

    public void setPort(Integer port) {
        this.port = port;
    }
   //List集合
    private List<String> list;

    public void setList(List<String> list) {
        this.list = list;
    }
    //List集合遍历
    public void printList(){
        list.forEach(s -> System.out.println(s));
    }

    //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集合
    public 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注入
    public Properties properties;

    public void setProperties(Properties properties) {
        this.properties = properties;
    }
    //properties遍历
    public void printPro(){
        properties.forEach((k,v)-> System.out.println(k+","+v));
    }
2、配置文件的bean标签设置property标签

​

<!--
        IOC通过property标签手动注入
            name:指bean对象的属性名
            ref:指定bean标签的id属性值
            value:具体的值(基本数据类型   常用数据类型|日期 集合)
    -->
    <bean id="userServices" class="com.shsxt.services.UserServices">
        <!--set注入-->
        <property name="userDao" ref="userDao"></property>
        <property name="host" value="192.168.28.249"></property>
        <property name="port" value="92"></property>

        <!--List集合注入-->
        <property name="list">
            <list>
                <value>北京</value>
                <value>上海</value>
                <value>深圳</value>
                <value>杭州</value>
                <value>成都</value>
            </list>
        </property>
        <!--Set集合注入-->
        <property name="set">
            <set>
                <value>北京BJ</value>
                <value>上海SH</value>
                <value>深圳SZ</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>

            </map>
        </property>
        <!--Properties注入-->
        <property name="properties">
            <props>
                <prop key="北京">天坛</prop>
                <prop key="杭州">西湖</prop>
                <prop key="上海">东方明珠</prop>
            </props>
        </property>
    </bean>
构造器注入
java代码

​ 提供带参构造器

private UserDao01 userDao01;
    private StuDao stuDao;
    //常用类型String 构造器注入
    private String uname;
    //构造器
   /* public UserServices01(UserDao01 userDao01) {
        this.userDao01 = userDao01;
    }*/

   /* public UserServices01(UserDao01 userDao01, StuDao stuDao) {
        this.userDao01 = userDao01;
        this.stuDao = stuDao;
    }*/

   public UserServices01(UserDao01 userDao01, StuDao stuDao, String uname) {
        this.userDao01 = userDao01;
        this.stuDao = stuDao;
        this.uname = uname;
    }

XML配置
<!--
        IOC通过构造器注入:
            通过constructor-arg标签进行注入
            name:属性名称
            ref:指定bean标签的id属性值
            value:基本数据类型的值
            index:构造器中的参数下标
    -->
    <bean id="userServices01" class="com.shsxt.services.UserServices01">
        <constructor-arg ref="userDao01"></constructor-arg>
        <constructor-arg ref="stuDao"></constructor-arg>
        <constructor-arg name="uname" value="admin"></constructor-arg>
    </bean>
	<!--Bean对象依赖-->
    <bean id="userDao01" class="com.shsxt.dao.UserDao01"></bean>
    <bean id="stuDao" class="com.shsxt.dao.StuDao"></bean>

可能出现的问题:循环依赖

​ java代码:


public class AccountService {

    private RoleService roleService;

    //构造器
    public AccountService(RoleService roleService) {
        this.roleService = roleService;
    }

    /*public void setRoleService(RoleService roleService) {
        this.roleService = roleService;
    }*/

    public void test(){
        System.out.println("AccountService Test...");
        roleService.test();
    }
}


public class RoleService {
    private AccountService accountService;


    //构造器
    public RoleService(AccountService accountService) {
        this.accountService = accountService;
    }
    //
    /*public void setAccountService(AccountService accountService) {
        this.accountService = accountService;
    }*/

    public void test(){
        System.out.println("RoleService Test....");
        accountService.test();
    }
}

XML配置文件

	 <!--
        如果多个bean对象互相注入,则会出现循环依赖问题
        可通过set方法注入解决
    -->
	<bean id="roleService" class="com.shsxt.services.RoleService">
        <constructor-arg ref="accountService"></constructor-arg>
    </bean>
    <bean id="accountService" class="com.shsxt.services.AccountService">
        <constructor-arg ref="roleService"></constructor-arg>
    </bean>

解决构造器注入的循环依赖方法:将构造器注入改为set方法注入

​ java代码

public class RoleService {
    private AccountService accountService;
    /*
    //构造器
    public RoleService(AccountService accountService) {
        this.accountService = accountService;
    }
    */
    public void setAccountService(AccountService accountService) {
        this.accountService = accountService;
    }
    public void test(){
        System.out.println("RoleService Test....");
        accountService.test();
    }
}


public class AccountService {

    private RoleService roleService;
    /*
    //构造器
    public AccountService(RoleService roleService) {
        this.roleService = roleService;
    }
    */
    public void setRoleService(RoleService roleService) {
        this.roleService = roleService;
    }
    public void test(){
        System.out.println("AccountService Test...");
        roleService.test();
    }
}
	<!--修改为set方法注入-->
    <bean id="accountService" class="com.shsxt.services.AccountService">
        <property name="roleService" ref="roleService"></property>
    </bean>
    <bean id="roleService" class="com.shsxt.services.RoleService">
        <property name="accountService" ref="accountService"></property>
    </bean>
静态工厂注入(了解)
1、定义工厂类
//工厂类
public class StaticFactory {

    //定义一个TemService类型的静态方法
    public static TemService createTemService(){
        return new TemService();
    }
}

public class TemService {
    public void test(){
        System.out.println("TemService Test....");
    }
}

2、在配置文件中设置bean标签,指定工厂对象并设置对应的方法
<!--静态工厂注入的bean标签-->
    <bean id="temService" class="com.shsxt.factory.StaticFactory" factory-method="createTemService"></bean>
实例化工厂注入(了解)
1、定义工厂类
public class InstanceFactory {
    public TemService createTemService(){
        return new TemService();
    }
}
2、声明工厂bean标签,声明bean对象,指明工厂对象和工厂方法
<!--实例化工厂注入得bean标签-->
    <bean id="instanceFactory" class="com.shsxt.factory.InstanceFactory"></bean>
    <bean id="temService" factory-bean="instanceFactory" factory-method="createTemService"></bean>
自动注入
1、准备环境(修改配置文件)
<?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">
   
</beans>
2、开启自动注入
 <context:annotation-config />

##### 	3、给注入的bean对象添加注解 

###### 	@Resource注解

@Resource注解实现自动注入(反射)
1、默认根据属性字段名称查找对应的spring.xml文件中的bean标签
2、如果属性字段名称未找到,则通过类型(class类型)查找
3、属性可以提供set方法,也可以不提供set方法
4、注解可以声明在属性级别或set方法级别
5、@Resource可以设置name属性,name属性值必须与spring.xml中的bean标签的id属性值一致;如果设置了name属性值,就只会按照name属性值查找bean对象
6、当注入接口时,只有一个类实现了该接口则可以正常使用@Resource注入,如果多个类实现了该接口,则需要添加name属性@Resource(name="")指定被需要被实例化的bean对象


```java
	@Resource
    private UserDao userDao;
    @Resource(name ="userDao")
    //set方法
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }	
@AutoWired注解
@AutoWired注解实现自动化注入:
     1、默认通过类型(class类型)查找bean对象   与属性字段的名称无关
     2、属性可以提供set方法,也可以不提供set方法
     3、注解可以声明在属性级别或set方法级别
     4、可以添加@Qualifier注解结合使用,通过value属性查找bean对象(@Qualifier(value="")value属性值必须设置,且与spring.xml中的bean标签中的id属性值对应)
    
	@Autowired
    private AutoDao autoDao;
    @Autowired
    @Qualifier(value = "autoDao")
    //set方法
    public void setAutoDao(AutoDao autoDao) {
        this.autoDao = autoDao;
    }

Spring IOC扫描器

Spring IOC扫描器
                作用:将bean对象统一进行管理,简化开发配置,提高开发效率
                步骤:
                    1、设置自动扫描的范围
                        如果bean对象未在指定包范围,即使声明注解,也无法实例化
                    2、使用指定的注解(声明在类级别上)      bean对象的id属性默认是类的首字母小写
                        Dao层:
                            @Repository
                        Service层:
                            @Service
                        Controller层:
                            @Controller
                        开发的类实在不明确到底属于哪个层,可以使用@Component注解定义

                        注:开发过程中建议按照指定规则声明注解
1、设置自动扫描的范围
<!--设置自动扫描的范围-->
<context:component-scan base-package="com.shsxt" />
2、使用特定的注解
//dao层
@Repository
public class ResourceDao {
    public void test(){
        System.out.println("Hello ResourceDao......");
    }
}
//service层
@Service
public class ResourceService {
    public void test(){
        System.out.println("ResourceService。。。。。。。。");
    }
}
//Controller层
@Controller
public class UserController {
    public void ucontroller(){
        System.out.println("UserController");
    }
}
//其他层
@Component
public class UserFactory {
    public void test(){
        System.out.println("UserFactory.....");
    }
}

Bean的作用域

singleton作用域(单例作用域)
Spring IOC容器在实例化对象时,会将单例对象设置到单例缓存池中
    lazy-init属性(懒加载)
        如果为false,则在IOC容器启动时会实例化bean对象,默认是false
        如果为true,则IOC容器启动时不会实例化Bean对象,在使用bean对象时才会实例化
prototype作用域(原型作用域)
Spring IOC容器在实例化对象时,不会将单例对象设置到单例缓存池中,每一次实例都是一次新的对象
Web作用域
request作用域:
         在每一次请求实例化一个bean对象
session作用域:
          在每一次有效会话实例化一个bean对象
globalSession作用域:
          类似于session

Bean的生命周期

 Bean的生命周期包括Bean的定义、初始化、使用和销毁4个阶段
  	定义:
       	通过配置文件的方式来定义Bean的
        初始化(两种方式):
            默认在IOC容器加载时,就实例化对象
            1、在配置文档中通过指定init-method属性完成
            2、实现org.springframework.beans.factory.InitializingBean接口
               使用:

               销毁:
                 步骤1:实现销毁方式(Spring容器会维护bean对象的管理,可以指定 bean对象的销毁所要 执行的方法)
<bean id="userServiceImpl"class="com.shsxt.service.impl.UserServiceImpl" initmethod="init" destroy-method="destroy"> </bean>
                 步骤2:通过AbstractApplicationContext 对象,调用其close方法实现bean的销毁过程。
 AbstractApplicationContext ctx=new ClassPathXmlApplicationContext("Springapplication.xml"); 	ctx.close();

化对象时,不会将单例对象设置到单例缓存池中,每一次实例都是一次新的对象


#### 	Web作用域

request作用域:
在每一次请求实例化一个bean对象
session作用域:
在每一次有效会话实例化一个bean对象
globalSession作用域:
类似于session


### Bean的生命周期

Bean的生命周期包括Bean的定义、初始化、使用和销毁4个阶段
定义:
通过配置文件的方式来定义Bean的
初始化(两种方式):
默认在IOC容器加载时,就实例化对象
1、在配置文档中通过指定init-method属性完成
2、实现org.springframework.beans.factory.InitializingBean接口
使用:

           销毁:
             步骤1:实现销毁方式(Spring容器会维护bean对象的管理,可以指定 bean对象的销毁所要 执行的方法)

<bean id="userServiceImpl"class=“com.shsxt.service.impl.UserServiceImpl” initmethod=“init” destroy-method=“destroy”>
步骤2:通过AbstractApplicationContext 对象,调用其close方法实现bean的销毁过程。
AbstractApplicationContext ctx=new ClassPathXmlApplicationContext(“Springapplication.xml”); ctx.close();


21、二维卷积层(convolution2dLayer)的全面解析 本文全面解析了二维卷积层(convolution2dLayer)的原理、属性和应用,详细介绍了其在深度学习中的作用及实现方法。文章涵盖创建卷积层的语法、参数设置、算法原理、输入输出格式、优化策略以及实际应用案例,旨在帮助读者更好地理解和应用二维卷积层构建高效的深度学习模型。 阅读详情

相关推荐

Second-Order Cone Programming(SOCP) 二阶锥规划

个人博客Glooow,欢迎各位老师来踩踩 文章目录1. 二阶锥1.1 二阶锥定义1.2 二阶锥约束2. 优化问题建模3. 类似问题转化3.1 二次规划3.2 随机线性规划4. 问题求解 1. 二阶锥 1.1 二阶锥定义 在此之前,先给出二阶锥的定义。 在 kkk 维空间中二阶锥 (Second-order cone) 的定义为 Ck={[ut]∣u∈Rk−1,t∈R,∥u∥≤t} \mathc...

Glooow的博客 3万+

Spring framework项目简介信息_三木_新浪博客

Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。 Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的Inversion of Control容器。然而,这仅仅是完整图景中的一部分:Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。 Spring提...

新浪博客搬家测试账号 108

Libero SoC v2021.1离线安装与IP核配置全攻略

本文详细介绍了Libero SoC v2021.1在离线环境下的完整安装与配置流程。核心内容包括如何选择正确的离线安装包、获取并配置许可证、安装与挂载MegaVault IP库,以及将ModelSim仿真器切换至免费SE模式的关键步骤。文章旨在帮助内网开发者避开常见陷阱,顺利完成FPGA开发环境的搭建。

weixin_29279101的博客 406

深入了解Spring IoC

IoC全称Inversion of Control即控制反转,它还有一个别名依赖注入。spring利用Ioc容器帮我们自动构建对象及注入依赖对象,减少了对象构建与业务代码的耦合,使得我们能够更加高效愉快的写bug????了( ̄▽ ̄)"。接下来我们详细介绍下这个spring Ioc吧。 依赖注入原理 1.三种依赖注入方式 spring中有三种常见的依赖注入方式即:构造方法注入、setter方法注入、接口注...

斜阳雨陌 526

稳定性性能系列之十五——系统稳定性监控体系建设:从指标到预警的完整方案

深入探讨Android系统稳定性监控体系的设计与实现,涵盖指标体系设计、数据采集方案、异常检测算法、预警响应机制,并提供完整的监控平台搭建实践。

Cheson的专栏 1357

深入解析MOS管电容特性:从基础理论到高频应用

本文深入解析了MOS管的电容特性,从基础物理结构出发,详细拆解了栅氧电容、重叠电容和结电容的成因与影响。文章重点探讨了电容值随工作状态变化的非线性特性,并分析了其在CMOS高频开关电源、射频电路等应用中的关键作用,包括开关损耗、米勒效应、信号完整性挑战以及如何将电容特性转化为可控元件(如MOS变容管)的机遇。最后提供了从选型、仿真到PCB布局的实战设计指南。

weixin_29278805的博客 381

深入了解Spring之IoC

GitHub:https://github.com/JDawnF/learning_note 目录 1、IoC 容器 2、依赖注入 3、实现依赖注入的方式 4、Spring中的IoC 容器(ApplicationContext 面向开发应用) 5、常用的 ApplicationContext 容器 6、Spring IoC 的实现机制 1.BeanDefinitionRegistr...

striveb的博客 406

堆一呼一吸之间:动态扩缩容引发JVM堆内存震荡的伸缩算法、代际传导与容器定容解析

Kubernetes扩容后,新Java实例的GC频率常比老实例高出数倍,堆容量反复伸缩。本文从一次支付系统的GC陡增出发,结合HotSpot源码与JDK 8实测,拆解堆伸缩的记账规则:期望容量以GC后已用量为基数、以Xms为下限,按空闲比例判断扩缩,收缩只在老年代回收后按0%、10%、40%、100%步进;再剖析年轻代随老年代联动、晋升风暴与元空间触发线,对比Parallel、G1、ZGC等收集器及JDK 26的变化,讨论容器分账、HPA共振与原地扩缩容,最后给出分级定容、预热与监控的方案。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

了解spring中的ioc

大型分布式系统犹如一个生命,系统中各个服务犹如骨骼,其中的数据犹如血液,而Kafka犹如经络,串联整个系统。这份Kafka源码笔记通过大量的设计图展示、代码分析、示例分享,把Kafka的实现脉络展示在读者面前,帮助读者更好地研读Kafka代码。麻烦帮忙转发一下这篇文章+关注我《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

2401_84010762的博客 986

26、遥感图像无监督变化检测方法解析

本文详细解析了遥感图像中的无监督变化检测方法,重点介绍了基于快速模糊 C-均值聚类的无监督变化检测方法(CDFFCM)在滑坡映射中的应用。CDFFCM 方法利用图像结构信息和高斯金字塔技术,提高了检测的准确性,减少了参数数量,并缩短了计算时间。该方法通过与传统方法的对比,展现出在高分辨率遥感图像滑坡检测中的显著优势。此外,文章还探讨了 CDFFCM 的未来发展趋势,包括技术融合、多模态数据应用以及智能化与自动化方向。

game4的博客 149

游戏大厂技术护城河——为什么你抄不了原神?

│ │ │ │ ↓ 通过 │ │ │ │。│ │ │ │ ↓ 成功 │ │ │ │。│ │ │ │ ↓ 完成 │ │ │ │。│ │ │ │ ↓ 达标 │ │ │ │。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 71

一文带你了解——Spring IoC

IoC: Inversion of Control (控制反转),也就是说 Spring 是一个"控制反转"的容器。ApplicationContext,也就是Spring上下文,Spring的运行环境。控制权交给Spring的IOC容器,由IOC容器创建及管理对象,也就是bean的存储。

m0_60462557的博客 1539

学Simulink——基于Simulink的扰动观测器(DOB)补偿坡道重力分量

(质量5kg,坡度30°,目标速度1m/s)为例,基于Simulink搭建“DOB+PI”复合控制仿真平台,从系统建模、DOB算法推导、离散化实现到Simulink模块搭建,提供模块化模型、核心代码及参数整定表,帮助工程师彻底解决重力等恒值扰动引起的稳态误差问题。采用双线性变换(Tustin): s=Ts​2​z+1z−1​,其中 Ts​为控制周期。模块相加(注意符号:ufinal​=upi​−ucomp​或 upi​+ucomp​,取决于扰动定义方向,此处假设重力为正,控制力需反向抵消,故为减)。

MHD0815的博客 69

spring概述 ioc了解

spring介绍 spring是分层的Java SE/EE应用的full-stack轻量级开源框架。它是以IOC(Inversion Of Control)控制反转和AOP(Aspect Oriented Programming)面向切面编程为核心,提供了表现层springmvc和持久层spring JDBC以及业务层的事务管理等企业级应用解决方案。还能实现将开源世界中众多优秀的第三方框架和类库整...

ZHONGZEWEI的博客 272

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

数学建模模型总结

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

了解Spring IOC容器

什么是Spring IOC容器? IOC容器,全称(Inversion of Control),即控制反转,是Spring框架的核心功能之一,它把传统上由程序代码直接操控的对象调用权交给了容器,通过容器来实现对象组件的装配和管理,利用了java反射机制。 Spring IOC负责创建对象,管理对象(通过依赖注入(DI)),装配对象,配置对象,并且管理这些对象的整个生命周期,所以IOC就像一个存...

m0_37718872的博客 342

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

通过HelloSpring了解Spring的IOC

在Dao层创建一个Hello实体类。 package Dao; public class Hello { private String str; public String getStr() { return str; } public void setStr(String str) { this.str = str; } @Override public String toString() { return "Hello{" + "str='" + str + '\'' + '}'; } }

weixin_44976835的博客 215

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring中的IOC容器必须要了解的一些概念

文章目录Spring中的IOC容器必须要了解的一些概念a.SpringIOC容器意义b.怎样往Spring的IOC容器里面存储对象c.怎样从SpringIOC容器中取对象d.如果对象的属性是对象类型,那么要怎么给对象的属性赋值呢?e.SpringIOC容器中怎样实现自动装配f.在SpringIOC容器中如何给各种集合属性赋值? Spring中的IOC容器必须要了解的一些概念 a.SpringIOC容器意义 Spring的IOC容器是Spring最为重要的一个东西,在学习Spring之前,我们如果想要在一个程

xzy的博客 564

深入源码了解spring之IOC容器

前言 Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。而 Spring 框架的系统架构简要说明如下:         Spring 总共大约有20个模块,由1300多个不同的文件构成。而这些组件被分别整合在核心容器(Core Conta

believedark的博客 399

Spring IOC 入门了解

Spring IOC 这里只记录 Spring 核心容器相关笔记。 参考文档 尚硅谷-王泽 Spring 笔记、示例代码资源,在百度云,联系我要密码 Spring Core Container Spring Core Container 包括 Beans、Core、Context、Expression。 本文档主要记录 IOC 和 AOP 的内容。 这里的架构图是从 4.3.27 Doc 中找出来的,所以可能有点对不上,不过没什么大问题。 IOC IOC,即 Inversion Of Cont

Wow 五六 !!! 的博客 160

了解一下Spring核心概念——IOC IOC容器 DI Bean

理解什么是IOC/DI思想什么是IOC容器和什么是Bean(1)什么IOC/DI思想?IOC:控制反转,控制反转的是对象的创建权DI:依赖注入,绑定对象与对象之间的依赖关系(2)什么是IOC容器?Spring创建了一个容器用来存放所创建的对象,这个容器就叫IOC容器(3)什么是Bean?容器中所存放的一个个对象就叫Bean或Bean对象。

coderge's 优快云 Blog. 678

深入了解 Spring IOC DI 原理

什么是 IOC IOC 被称为控制反转,通俗的说就是 我们需要使用一个对象而我们不在由自己去实现控制而交给Spring框架来控制对象的使用。 先上图: 未使用spring框架 使用spring框架 可以看到 Spring将我们的控制权由对象A转移到Spring进行。 那么什么是DI( 依赖注入 )? 这个虽然和控制反转将的是一个概念,但是DI是从被调用者的角度来讲的。如上图,我们被依赖...

图图是只猫 1493

①【Spring】一文了解IOC容器

》》》Spring框架 》》》了解IOC容器

ebb29bbe的博客 1122

一起了解Spring IOC吧~

学习了SpringIOC后的见解,不足请补充!&&敏而好学,不耻下问。----孔子

L170311的博客 238
上一篇: 网络编程
china_zzx
博客等级 码龄7年 0粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值