zoukankan      html  css  js  c++  java
  • Spring ioc 常用 详解

    Spring容器

    配置对象时默认的单例的
    可以设置bean的scope属性

    1. singleton 单例模式,只会在IOC容器初始化的时候创建bean,并且只会创建一次
    2. prototype 原型模式,在每次获取bean的时候才会创建bean,并且每次获取都会创建一个新的对象
    3. session 每个会话共享一个bean
    4. request 每个请求共享一个bean

    配置的方式

    • 通过 属性名 对应 属性值 进行配置
    • 通过类的构造进行配置
    • 当一个javaBean中包含对像的属性时 可以通过(ref)引用的方式配置
    • list,map,set
    <list>
        <ref bean="beanId"/>
    </list>
    <set>
        <ref bean="beanId"/>
    </set>
    <map>
        <entry key="AA" value-ref="b1"/>
        <entry key="BB" value-ref="b2"/>
    </map>
    
    • bean 自动配置
      通过autowire可以实现bran的自动配置
      1. autowire="byName" 要求属性名与对象Bean的id相同
      2. autowire="byType" 要求自动配置的属性对象的类型与属性的类型一致且唯一
    • 配置 Properties
    <property name="properties">
        <props>
            <prop key="driverClassName">oracle.jdbc.driver.OracleDriver</prop>
            <prop key="url">jdbc:oracle:thin:@127.0.0.1:1521:XE</prop>
        </props>
    </property>
    
    注解配置
    <context:component-scan base-package="com.yuing.spring1"/><!--开启自动扫描组建-->
    
    • @Component 任意的java类
    • @Controller 控制层
    • @Repository DAO层
    • @Service 业务层

    配置过滤器

    • exclude-filter 不包含过滤的条件
    • include-filter 包含过滤的条件 (在使用时应先关闭默认的过滤器use-default-filters="false")
    • type有五种类型
    aspectj assignable custom regex annotation 根据注解过滤
    org.springframework.stereotype.Component //@Component(任意一个类)
    org.springframework.stereotype.Repository //@Repository
    org.springframework.stereotype.Service //@Service
    org.springframework.stereotype.Controller //@Controller

    自动注入:@Autowire 标签贴在对象上 在容器中返回对象

    <context:component-scan base-package="包名">
        <context:exclude-filter type="过滤的条件类型" expression="条件"/>
    </context:component-scan>
    <context:component-scan base-package="包名" use-default-filters="false">
        <context:include-filter type="过滤的条件类型" expression="条件"/>
    </context:component-scan>
    

    给bean的属性设置特殊值

    • 设置特殊字符串 "<",">"
    <!-- 在value标签中的<![CDATA[value]]> 中设置属性的值 -->
    <property name="propertyName">
        <value><![CDATA[<Java开发>]]></value>
    </property>
    
    • 设置空置
    <property name="propertyName">
        <null/>
    </property>
    

    标签 属性

    • bean标签 配置javaBean对象

    • util标签 声明(list,map,set,property)

    • p标签 bean标签的属性 p:属性名="属性值"

    • context标签 加载外部文件

    • abstract:将bean的abstract属性设置为true时,该bean只能作为模板bean,不会被容器初始化

      子bean通过 parent="beanId" 加载模板

    bean的生命周期

    ClassPathXmlApplicationContext 容器 被初始化时里面的bean就都被创建ClassPathXmlApplicationContext 销毁时 bean 也跟着销毁
    bean的属性

    init-method="" :可以指定当bean加载成功后执行一个bean对象中的初始化方法

    destroy-method="" :可以指定当bean即将销毁时 执行一个bean对象中的销毁的化方法

    配置druid连接池 加载properties文件 调用其中的值

    • 加载properties文件
     <context:property-placeholder location="classpath:db.properties"/>
    
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
        <property name="url" value="${url}"/>
        <property name="driverClassName" value="${driverClassName}"/>
    </bean>
    

    SPEL:Spring的表达式语言

    #{beanId}                  引用其他的bean对象
    #{beanId.pro}              引用其他bean对象的属性值 
    #{beanId.methodName()}     调用方法得到返回值
    #{田间 ? '真的返回值' : '假返回值'}      三目运算
    

    工厂Bean (FactoryBean)org.springframework.beans.factory.FactoryBean;

    public class CarFactoryBean implements FactoryBean<Car> {} //以Car类为例
    
    • 配置的方式
    <bean id="car" class="com.hwua.spring02.factory.CarFactoryBean"/>
    

    Bean后置处理器(初始化之前 和初始化之后执行)

    配置:

     <bean class="com.hwua.spring02.util.MyPostProcessor"/>
    

    java代码:

    public class MyPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object o, String s) throws 
        //参数 o: Bean对象  s: Bean的id
        BeansException {
            System.out.println("MyPostProcessor.Before : "+o+",s:"+s);
            if(o instanceof Book){
                //是book
            }else if (o instanceof Car){
                //是Car
            }
            return o;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
            System.out.println("MyPostProcessor.After : "+o+",s:"+s);
            return o;
        }
    }
    

    java工厂类的配置(了解)

    Java代码

    public class StaticCarFactory {
    
        private static Map<String,Car> carMap = new HashMap<>();
    
        static {
            Car bmw = new Car();
            bmw.setBrand("BMW");
            bmw.setPrice(9.9);
            Car audi = new Car();
            audi.setBrand("audi");
            audi.setPrice(19.9);
            carMap.put("BMW",bmw);
            carMap.put("audi",audi);
        }
    
        public static Car createCar(String brand){
            return carMap.get(brand);
        }
    
    }
    
    

    xml代码

    <!--静态工厂创建对象不需要实例化工厂类-->
    <bean id="car" class="com.hwua.spring02.factory.StaticCarFactory"
          factory-method="createCar">
        <constructor-arg [name="参数名"] value="audi"/>
    </bean>
    
    <!--实例工厂需要先实例化工厂类-->
    <bean id="carFactory" class="com.hwua.spring02.factory.InstanceCarFactory"/>
    
    <!--使用工厂类创建Car对象-->
    <bean id="car1" factory-bean="carFactory" factory-method="createCar">
        <constructor-arg [name="参数名"] value="audi"/>
    </bean>
    

    在Java类中使用:

    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//创建容器的对象
    
    ac.getBean(Class<T>|"IdString");//获取javaBean对象 当一个类配置了多个javabean时通过类和id可以锁定一个JavaBean
    
    @Autowired      //自动装配(默认是根据class)
    @Qualifier("bookServer")    //根据id进行装配
    BookServer bookServer;
    
    

    实例

    <?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="person1" class="com.yuing.spring1.User">
            <property name="age" value="18"/>
            <property name="name" value="张三"/>
            <property name="book" ref="b1"/>
            <property name="book.name" value="oracle基础"/>
            <property name="book.price" value="99.8"/>
        </bean>
    
        <!--简单的javaBean-->
        <bean id="person2" class="com.yuing.spring1.User">
            <constructor-arg value="李四" name="name"/>
            <constructor-arg value="20" name="age"/>
        </bean>
    
        <bean id="person3" class="com.yuing.spring1.User">
            <constructor-arg value="李四" index="0"/>
            <constructor-arg value="20" index="1"/>
        </bean>
        <bean id="b1" class="com.yuing.spring1.pojo.Book">
            <property name="name" value="java基础"/>
            <property name="price" value="3.5"/>
        </bean>
    
    </beans>
    
  • 相关阅读:
    软件工程第三次个人作业——最大连续子数组和
    LeetCode(258.各位相加)的思路及解决过程
    VS2017中对C++的单元测试
    对大学三年学习生活的总结与反思
    软件工程 实验四 代码评审
    软件工程 实验二
    2020软件工程最后一次作业
    软件工程第四次作业(第二次结对)
    软件工程第三次作业
    软件工程第二次作业:最大字段和
  • 原文地址:https://www.cnblogs.com/yuing/p/8880733.html
Copyright © 2011-2022 走看看