• spring_IOC


    Spring

    IOC简介

    耦合与内聚

    • 耦合(Coupling):代码书写过程中所使用技术的结合紧密度,用于衡量软件中各个模块之间的互联程度
    • 内聚(Coheision):代码书写过程中单个模块内部各组成部分之间的联系,用于衡量软件中各个功能模块内部的功能联系
    • 程序书写的目标:高内聚,低耦合
      • 就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却不要那么紧密

    工厂模式发展史:应用程序UserServiceImpl->工厂UserDaoFactory->配置resource.xml->资源UserDaoImpl(配置与资源耦合)

    • 变更实现无须修改调用方源代码,也无需修改工厂代码,仅需要修改配置文件

    IoC

    • IoC(Inversion Of Control)控制反转,Spring反向控制应用程序所以需要使用的外部资源。
    • Spring控制的资源全部放置在Spring容器中,该容器称为IoC容器
    • 不需要管对象的创建和释放,spring来完成

    入门案例

    • 模拟三层架构中表现层调用业务层功能
      • 表现层:UserApp模拟UserServlet(使用main方法模拟)
      • 业务层:UserService
    • 入门案例步骤:
      1. 加载spring
      2. 创建资源
      3. 配置资源
      4. 使用资源
    //sercice接口
    package ls.service;
    
    public interface UserService {
        public void save();
    }
    
    package ls.service.impl;
    
    import ls.service.UserService;
    
    public class UserServiceImpl implements UserService {
        @Override
        public void save() {
            System.out.println("user service running.......");
        }
    }
    
    //service实现类
    import ls.service.UserService;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    //启动类
    public class UserApp {
        public static void main(String[] args) {
            //2.加载配置文件
            ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            //3.获取资源
            UserService userService = (UserService) ctx.getBean("userService");
            userService.save();
        }
    }
    
    <!-- 配置文件 -->
    <?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">
            <!-- 1.创建spring控制的资源 -->
            <bean id="userService" class="ls.service.impl.UserServiceImpl"/>
    </beans>
    

    Ioc配置(XML)格式

    bean

    image
    image

    • bean的scope设置为singleton 创建对象是单例的,使用ctx.getBean()使用的是一个对象
    • bean的scope设置为prototype创建对象是非单例的,使用ctx.getBean()使用的不是一个对象
    • 当创建对象是单例时,在加载配置文件的时候创建对象,当创建对象非单例时,在getBean时创建对象

    bean的生命周期

    image

    package ls.service.impl;
    
    import ls.service.UserService;
    
    public class UserServiceImpl implements UserService {
        public UserServiceImpl(){
            System.out.println("constructor is running");
        }
        public void init(){
            System.out.println( "init...");
        }
        public void destroy(){
            System.out.println( "destroy...");
        }
        @Override
        public void save() {
            System.out.println("user service running.......");
        }
    }
    
    
    <?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">
            <!-- 1.创建spring控制的资源 -->
            <bean id="userService" class="ls.service.impl.UserServiceImpl"/>
            <!-- 初始化和销毁时执行方法 -->
            <bean id="userService3" scope="singleton" init-method="init" destroy-method="destroy"
                  class="ls.service.impl.UserServiceImpl"/>
    </beans>
    
    • bean的生命周期和此bean是否为单例相关,如果是单例的则只执行一次init或destroy,反之,执行多次。
      image

    bean对象的创建方式(工厂)

    image

    image

    DI

    • DI(Dependency Injection)依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入

    依赖注入的两种方式

    set注入(主流)

    image
    引用类型和非引用类型注入:Integer,String也按照非引用类型注入

    <?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">
            <!-- 1.创建spring控制的资源 -->
    <!--        <bean id="userService" class="ls.service.impl.UserServiceImpl"/>-->
            <!-- 初始化和销毁时执行方法 -->
            <bean id="userService" scope="singleton" init-method="init" destroy-method="destroy"
                  class="ls.service.impl.UserServiceImpl">
                    <!-- 3.将要注入的引用类型的变量通过property属性进行注入,对应的name是要注入的变量名,使用ref属性生命要注入bean的id-->
    
                    <property name="userDao" ref="userDao"/>
                    <property name="num" value="5"/>
            </bean>
            <!-- 将要注入的资源生命为bean -->
            <bean id="userDao" class="ls.dao.impl.UserDaoImpl"/>
    
    </beans>
    
    package ls.service.impl;
    
    import ls.dao.UserDao;
    import ls.service.UserService;
    
    public class UserServiceImpl implements UserService {
        private UserDao userDao;
        private int num;
        //1.对需要进行注入的变量添加set方法
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
        public void setNum(int num) {
            this.num = num;
        }
        public UserServiceImpl(){
            System.out.println("constructor is running");
        }
        public void init(){
            System.out.println( "init...");
        }
        public void destroy(){
            System.out.println( "destroy...");
        }
        @Override
        public void save() {
            userDao.save();
            System.out.println("user service running.......");
        }
    }
    

    构造方法注入

    image

    • 在UserServiceImpl中添加构造方法
    • 在配置文件中添加name对应属性名,vaule/ref代表非引用或引用类型的值,type表示类型,index表示索引,索引从0开始

    集合类型数据注入

    image

    • 集合类型数据注入
    <!-- List集合类型注入数据 -->
    <property name="myList">
    	<list>
    		<value>itheima</value>
    		<value>6666</value>
    		<ref bean="userService"/>
    		<baan class="com.itheima.service.ApplyService"/>
    	</list>
    </property>
    
    <!-- Properties类型注入数据-->
    <property name="myProps">
    	<props>
    		<prop key="username">root</prop>
    		<prop key="password">root</prop>
    	</props>
    </property>
    
    <!-- 数组类型注入数据-->
    <property name="myArray">
    	<array>
    		<value>itheima</value>
    		<value>555</value>
    		<ref bean="userService"/>
    		<bean class="com.itheima.service.ApplyService"/>
    	</array>
    </property>
    
    <!-- Set集合类型注入数据-->
    <property name="mySet">
    	<set>
    		<value>itheima</value>
    		<value>555</value>
    		<ref bean="userService"/>
    		<bean class="com.itheima.service.ApplyService"/>
    	</set>
    </property>
    
    <!-- Map集合类型注入数据-->
    <property name="myMap">
    	<map>
    		<entry key="name" value-ref="itheima"/>
    		<entry key="fame" value-ref="666"/>
    		<entry key="userService">
    			<ref bean="userService"></ref>
    		</entry>
    		<entry key="applyService">
    			<bean class="applyService"></bean>
    		</entry>
    	</map>
    </property>
    

    使用p命名空间简化配置

    image
    image

    SpEL

    image
    image
    image

    properties文件

    image

    <!-- 1.加载context命名空间的支持-->
    <!-- xmlns:context="http://www.springframework.org/schema/context"-->
    <!-- 2.加载配置文件-->
    <context:property-placeholder location="classpath:*.properties"/>
    <bean id="userDao" class="com.itherima.dao.impl.UserDaoImpl">
    	<property name="userName" value="${username}"/>
    	<property name="password" value="${pwd}"/>
    </bean>
    

    团队开发

    image

    	<import resource="applicationContext-user.xml"/>
    	<import resource="applicationContext-book.xml"/>
    
    • Spring容器加载多个配置文件
    new ClassPathXmlApplicationContext("config1.xml","config2.xml");
    

    image

    applicationContext

    image

    第三方资源配置

    注解开发

    imageimage
    image

    常用注解

    image

    //applicationContext.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns="http://www.springframework.org/schema/context"
        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
    		http://www.springframework.org/schema/context
            https://www.springframework.org/schema/beans/spring-context.xsd
    		">
    
        <!--启动注解驱动,指定对应扫描的路径,也就是资源所在的包-->
    	<context:component-scan base-package="包名"/>
    </beans>
    

    image
    image
    image
    image
    image
    image
    image
    image
    image
    image
    image
    image
    image
    image
    image
    image

    AOP

    • 面向切面编程,是一种编程范式。
      image
      image
      image

    事务

  • 相关阅读:
    对《分享一下自己用c++写的小地图》一文的补充
    大神的Blog挂了,从Bing快照里复制过来的备份
    如何创建独立的UE4服务端
    打包如何打包额外文件,比如Sqlite数据库的db文件
    关于如何通过定义自己的CameraManager来控制视角
    Slate中绑定动态数据
    分享一下自己用c++写的小地图
    2016.8看到的一些有用的文章
    如何在插件中添加Actor类
    如何使用的Ue4自带的SQLiteSupport
  • 原文地址:https://www.cnblogs.com/rhy2103/p/16343917.html
Copyright © 2020-2023  润新知