zoukankan      html  css  js  c++  java
  • Spring IOC容器2

    1.1参数值注入

    1.1.1注入基本值

    注入基本值

    <value/>元素可以通过字符串指定属性或构造器参数的值。容器将字符串从java.lang.String类型转化为实际的属性或参数类型后给Bean对象注入。

    <bean id="myDateSource" 
                class="org.apache.commons.dbcp.BasicDataSource">
        <property name="username">
                <value>root</value>
        </property>
        <property name="password">
                <value>1234</value>
        </property>
        …………
    </bean>

    注入基本值(续1)

    也可以通过value属性指定基本值

    <bean id="myDataSource" 
                class="org.apache.commons.dbcp.BasicDataSource">
            <property name="username" value="root"/>
            <property name="password" value="1234"/>
        …………
    </bean>

    注入bean对象

    注入bean对象,定义格式有内部bean和外部bean两种

    *注入内部bean

    <bean id="userService" class="com.service.userService">
        <property name="userDAO">
                <bean class="com.dao.OracleUserDao"></bean>
        </property>
    </bean>

    *注入外部bean(引用方式,方便重用)

    <bean id="userDAO" class="com.dao.OracleUserDao"/>
    
    <bean id="userService" class="com.service.UserService">
        <property name="userDAO" ref="userDAO"/>
    </bean>

    注入集合

    通过<list/>、<set/>、<map/>、及<props/>元素可以定义和设置与java类型中对应List、Set、Map及Properties的属性值。

    *List集合注入

    <bean id="messageBean" class="com.util.MessageBean">
        <property name="friends>
            <list>
                <value>Jack</value>
                <value>Tom</value>
                <value>Poli</value>
            </list>
        </property>
    </bean>

    *Set集合注入

    <bean id="messageBean" class="com.util.MessageBean">
        <property name="cities>
            <set>
                <value>北京</value>
                <value>上海</value>
                <value>深圳</value>
            </set>
        </property>
    </bean>

    *Map集合注入

    <bean id="messageBean" class="com.util.MessageBean">
        <property name="books>
            <map>
                <entry key="1001" value="java"></entry>
                <entry key="1002" value="javaScript"></entry>
                <entry key="1003" value="java web"></entry>
            </map>
        </property>
    </bean>    

    *Properties集合注入

    <bean id="messageBean" class="com.util.MessageBean">
        <property name="dbParam>
            <props>
                <prop key="username">root</prop>
                <prop key="password">1234</prop>
                <prop key="driverClassName">
                        com.mysql.jdbc.Driver
                </prop>
            </map>
        </props>
    </bean>        

    *引用方式List集合注入

    <util:list id="oneList">
        <value>Jack</value>
        <value>Tom</value>
    </util:list>
    <bean id="messageBean" class="com.util.MessageBean">
        <property name="friends" ref="oneList">
    ……
    </bean>

    *Set Map Properties都可以采用引用方式注入

    <util:list/> <util:set/> <util:props/>

    1.1.4 注入Spring表达式值

      Spring引入了一种表达式语言,这和统一的EL在语法上很相似,这种表达式语言可以用于定义基于XML和注解配置的Bean,注入一个properties文件信息。

    <util:properties id="jdbcProperties"
            location="classpath:org/config/jdbc.properties"/>
    <bean id="myDataSource"
            class="org.apache.commons.dbcp.BasicDataSource"/>
            <property name="username" 
                    value="#{jdbcProperties.username}"/>
            <property name="password" 
                    value="#{jdbcProperties.password}"/>
    </bean>

    1.1.5注入null或空字符串

    Spring将属性的空参数当中空String,下面给email属性设置了空String值(“”)

    <bean id="exampleBean" class="com.bean.ExampleBean">
        <property name="email" value=""/>
    </bean>

    如果需要注入null值,可以使用<null>元素

    <bean id="exampleBean" class="com.bean.ExampleBean">
        <property name="email">
                <null>
        </property>
    </bean>

    1.2基于注解的组件扫描

    1.2.1什么是组件扫描

    *指定一个包路径Spring会自动扫描该包及其子包所有组件类,当发现组件类定义前有特定的注解标记时,就将该组件纳入到Spring容器。等价于原有XML配置中的<bean>定义功能。

    *组件扫描可以替代大量XML配置的<bean>定义。

    1.2.2指定扫描类路径

    使用组件扫描,首先需要在xml配置中指定扫描类路径

    <context:component-scan base-package="org.example"/>

    上面配置,容器实例化时会自动扫描org.example包及其子包下所有组件类。

    1.2.3自动扫描的注解标记

      指定扫描类路径后,并不是该路径下所有组件类都扫描到Spring容器的,只有在组件类定义前面有以下注解标记时,才会扫描到Spring容器。

    注解标记 描述
    @Component 通用注解
    @Name 通用注解
    @Repository 持久层组件注解
    @Service 业务层组件注解
    @Controller 控制层组件注解

    1.2.4自动扫描组件的命名

      当一个组件在扫描过程中被检测到时,会生成一个默认id值,默认id为小写开头的类名。也可以在注解标记中定义id。下面两个组件id名字分别是oracleUserDao和loginService

    @Repository
    public class OracleUserDao implements UserDao{
      //……          
    }
    
    @Service("loginService")
    public class UserService{
      //……  
    }

    1.2.5指定组件的作用域

    通常受Spring管理的组件,默认的作用域是“singleton”。

    如果需要其他的作用域可以使用@Scope注解,只要在注解中提供作用域的名称即可。

    @Scope("prototype")
    @Repository
    public class OracleUserDao implements EmpDao{
      //……  
    }

    1.2.6初始化和销毁回调的控制

    @PostConstruct和@PreDestroy注解标记分别用于指定初始化和销毁回调方法,使用示例

    public class ExampleBean{
      @PostConstruct
      public void init(){
         //初始化回调方法        
      }
      @PreDestroy
       public void destroy(){
           //销毁回调方法
       }    
    }

    1.2.7指定依赖注入关系

      具有依赖关系的Bean对象,利用下面任意一种注解都可以实现关系注入

    @Resource

    @Autowired/@Qualifier

    @Inject/@Named

    *@Resource注解标记可以用在字段定义或setter方法定义前面,默认首先按名称匹配注入,然后类型匹配注入。

    public class UserService{
    
      //@Resource
    
      private UserDao userDao;
    
      @Resource
    
      public void setUserDao(UserDao dao){
    
          this.userDao=dao; 
    
        }
    
    }

    当遇到多个匹配Bean时注入会发生错误,可以显示指定名称,例如@Resource(name="empDao1")

    *@Autowired注解标记也可以用在字段定义或setter方法定义前面,默认按类型匹配注入

    public class UserService{
    
      //@Autowired
      private UserDao userDao;
    
      @Autowired
      public void setUserDao(UserDao dao){
          this.userDao=dao; 
        }
    }

    @Autowired当遇到多个匹配Bean时注入会发生错误,可以使用下面方法指定名称

    public class UserService{
    
      //@Autowired
      //@Qualifier("mysqlUserDao")
    
      private UserDao userDao;
    
      @Autowired
      public void setUserDao(@Qualifier("mysqlUserDao")
                             UserDao dao){
                 this.userDao=dao; 
        }
    }

    *@Inject注解标记是Spring3.0开始增添的对JSR-330标准的支持,使用前需要添加JSR-330的jar包,使用方法与@Autowired相似,具体如下

    public class UserService{
    
      //@Inject
      private UserDao userDao;
    
      @Inject
      public void setUserDao(UserDao dao){
          this.userDao=dao; 
        }
    }
    @Inject当遇到多个匹配Bean时注入会发生错误,可以使用@Name指定名称限定,使用方法如下
    public class UserService{
    
      private UserDao userDao;
    
      @Inject
      public void setUserDao(@Named("mysqlUserDao")
                                         UserDao dao){
          this.userDao=dao; 
        }
    }        

    1.2.8注入Spring表达式值

    @value注解可以注入Spring表达式值,使用方法

    *首先在xml配置指定要注入properties文件

    <util:properties id="jdbcProps"
                    location="classpath:db.properties"/>

    *然后在setter方法前使用@value注解

    public class JDBCDataSource{
       @value("#{jdbcProps.url}")
        private String url;
        @Value("#{jdbcProps.driver}")
         public void setUrl(String driver){
             class.forName(driver)
       }
    }
  • 相关阅读:
    Spark高级数据分析· 2数据分析
    rtsp 学习
    vs code 体验
    RTP 学习
    libev 学习使用
    TS 数据流分析学习
    linux 编程
    times、 time、clock函数说明
    gcc 学习
    2010912 双模机顶盒学习记录
  • 原文地址:https://www.cnblogs.com/liujie-e2/p/7429046.html
Copyright © 2011-2022 走看看