zoukankan      html  css  js  c++  java
  • Spring(二)scope、集合注入、自动装配、生命周期

    原文链接:http://www.orlion.ga/189/

    一、scope

    bean的scope属性中常用的有两种:singleton(单例,默认)和prototype(原型,每次创建新对象)

    例:beans.xml

    <bean id="userService" class="ml.orlion.service.UserService" scope="prototype">
        <property name="userDao" ref="userDao"/>
    </bean>

    在java文件中:

    BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
    UserService userService = (UserService)appContext.getBean("userService");
    UserService userServic2 = (UserService)appContext.getBean("userService");
    System.out.println(userService == userServic2);// 输出false

    二、集合注入

    UserDAOImpl.java:

    package ml.orlion.dao.impl;
    
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import ml.orlion.dao.UserDAO;
    import ml.orlion.model.User;
    
    public class UserDAOImpl implements UserDAO{
        
        private Set<String> sets;
        private List<String> lists;
        private Map<String , String> maps;
        
        public void saveUser(User user){
            System.out.println("save usering");
        }
    
        public Set<String> getSets() {
            return sets;
        }
    
        public void setSets(Set<String> sets) {
            this.sets = sets;
        }
    
        public List<String> getLists() {
            return lists;
        }
    
        public void setLists(List<String> lists) {
            this.lists = lists;
        }
    
        public Map<String, String> getMaps() {
            return maps;
        }
    
        public void setMaps(Map<String, String> maps) {
            this.maps = maps;
        }
        
        public String toString(){
            return sets.size() +"|"+ lists.size() +"|"+ maps.size();
        }
    }

    beans.xml中配置:

    <bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
          
          <property name="sets">
              <set>
                  <value>1</value>
              </set>
          </property>
          <property name="lists">
              <list>
                  <value>1</value>
                  <value>2</value>
              </list>
          </property>
          <property name="maps">
              <map>
                  <entry key="1" value="1"></entry>
                  <entry key="2" value="2"></entry>
                  <entry key="3" value="3"></entry>
              </map>
          </property>
      </bean>

    然后测试一下:

    BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
    UserDAO userDao = (UserDAO) appContext.getBean("userDao");
    System.out.println(userDao);// 输出 1|2|3

    三、自动装配AutoWire

    autowire属性有六种值:autodatact、byName、byType、constructor、default、no

    byName:按照名字自动去匹配

    byType:按照类型自动匹配

     

    UserDAOImpl.java:

    package ml.orlion.dao.impl;
    
    import ml.orlion.dao.UserDAO;
    import ml.orlion.model.User;
    
    public class UserDAOImpl implements UserDAO{
        // 添加id以区分
        private int daoId;
        
        public int getDaoId() {
            return daoId;
        }
    
        public void setDaoId(int daoId) {
            this.daoId = daoId;
        }
    
        public void saveUser(User user){
            System.out.println("save usering");
        }
        
        public String toString(){
            return "daoId" + daoId;
        }
    }

    beans.xml:

    <bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
          
         <property name="daoId" value="1"></property>
      </bean>
      <bean id="userDao2" class="ml.orlion.dao.impl.UserDAOImpl">
         <property name="daoId" value="2"></property>
      </bean>
    
      <bean id="userService" class="ml.orlion.service.UserService" scope="prototype" autowire="byName">
      </bean>

    测试一下:

    BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
    UserService userService = (UserService) appContext.getBean("userService");
    System.out.println(userService.getUserDao());

    这时候会输出daoId=1

     

    注:如果所有的bean都用同一种,可以使用beans的属性:defalut-autowire

     

    四、生命周期

    1、lazy-init

        lazy-init="true"则bean在Ioc容器初始化的时候不进行初始化

    注:可以beans标签上设置default-lazy-init="true"

     

    2、init-method(bean初始化的时候执行)、destroy-method(bean销毁的时候执行)

    UserService.java

    package ml.orlion.service;
    
    import ml.orlion.dao.UserDAO;
    import ml.orlion.dao.impl.UserDAOImpl;
    import ml.orlion.model.User;
    
    public class UserService {
    
        private UserDAO userDAO = new UserDAOImpl();
    
        public void init(){
            System.out.println("init");
        }
        
        public void destroy(){
            System.out.println("destroy");
        }
        public UserDAO getUserDao() {
            
            return userDAO;
        }
    
        public void setUserDao(UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
        public void saveUser(User user){
            this.userDAO.saveUser(user);
        }
    }

    beans.xml:

    <bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
         <property name="daoId" value="1"/>
      </bean>
    
      <bean id="userService" class="ml.orlion.service.UserService" destroy-method="destroy" init-method="init">
          <property name="userDao" ref="userDao"/>
      </bean>

    测试:

    ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
    UserService userService = (UserService) appContext.getBean("userService");
    appContext.destroy();// 需要主动调用该方法才会销毁bean

    注:scope="prototype"时,调用destroy不会销毁bean。Ioc容器不会管理bean的生命周期

  • 相关阅读:
    关于多机处理问题
    Prime
    Djkstra
    jbdc总结
    mysql存储过程
    sqlHelper 类型的编写
    JDBC开发
    java线程
    java事件监听机制
    坦克大战编程
  • 原文地址:https://www.cnblogs.com/orlion/p/5350854.html
Copyright © 2011-2022 走看看