• Spring学习笔记_IOC


    Spring简介

    1,   只用IOC

          spring.jar , jarkata-commons/commons-loggin.jar

    2,IOC容器

         实例化具体bean

        动态装配

    3,AOP支持

         安全检查

         管理transaction

     Spring配置

    1,注入类型

    •      setter(重要)
    •          构造方法(可以忘记)
    •     接口注入(可以忘记)
    <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl"><!-- new UserDAOImpl()-->
      </bean>
        
      <bean id="userService" class="com.bjsxt.service.UserService">
          <!-- 
          <property name="userDAO" ref="u" />  setter注入 ,调用setxxx方法
           -->
           <constructor-arg>  <!-- 构造方法注入,需要在UserService里面写构造方法,相当于调用了构造方法-->
               <ref bean="u"/>   <!-- 参考了另外一个已经new 的bean-->
           </constructor-arg>
      </bean>
      
      
    public class UserService {
        
        private UserDAO userDAO;  
        public void add(User user) {
            userDAO.save(user);
        }
        public UserDAO getUserDAO() {
            return userDAO;
        }
        public void setUserDAO(UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
        public UserService(UserDAO userDAO) {//用于构造方法注入
            super();
            this.userDAO = userDAO;
        }
    }

    2,id vs. name

      name可以用特殊字符

    <bean name="u" class="com.bjsxt.dao.impl.UserDAOImpl">
      </bean>
        
      <bean id="userService" class="com.bjsxt.service.UserService">
          <!-- 
          <property name="userDAO" ref="u" />
           -->
           <constructor-arg>
               <ref bean="u"/>
           </constructor-arg>
      </bean>

    3,简单属性的注入

    bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl">
          <property name="daoId" value="8"></property>
          <property name="daoStatus" value="good"></property>
      </bean>
    public class UserDAOImpl implements UserDAO {
        private int daoId;
        private String daoStatus;
        
        public int getDaoId() {
            return daoId;
        }
    
        public void setDaoId(int daoId) {
            this.daoId = daoId;
        }
    
        public String getDaoStatus() {
            return daoStatus;
        }
    
        public void setDaoStatus(String daoStatus) {
            this.daoStatus = daoStatus;
        }
    
        public void save(User user) {
            System.out.println("user saved!");
        }
        
        @Override
        public String toString() {
            return this.daoId + ":" + this.daoStatus;
        }
    }

     4,bean 中的scope属性

       singleton:只有一个

      prototype:每一个都不同

    5,集合注入

       很少用,不重要!

    public class UserDAOImpl implements UserDAO {
        /* (non-Javadoc)
         * @see com.bjsxt.dao.UserDAO#save(com.bjsxt.model.User)
         */
        private Set<String> sets;
        private List<String> lists;
        private Map<String , String> maps;
        
        
        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 UserDAOImpl() {
        }
        
        
    
        public void save(User user) {
            System.out.println("user saved!");
        }
        
        @Override
        public String toString() {
            return "sets size:" + sets.size() + "| lists size:" + lists.size() + "| maps size:" + maps.size() ; 
        }
    
    }
    <bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl">
          <property name="sets">
              <set>
                  <value>1</value>
                  <value>2</value>
              </set>
          </property>
          <property name="lists">
              <list>
                  <value>1</value>
                  <value>2</value>
                  <value>3</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>
                  <entry key="4" value="4"></entry>
              </map>
          </property>
      </bean>
    
      <bean id="userService" class="com.bjsxt.service.UserService">
      <!-- 
          <property name="userDAO">
              <ref bean="userDAO"/>
          </property>
           -->
           <constructor-arg>
               <ref bean="userDAO"/>
           </constructor-arg>
      </bean>

    6,自动装配

    •      byName
    •      byType
    •      如果所有的bean都用同一种,可以使用beans的属性:default-autowire
     <bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl">
          <property name="daoId" value="1"></property>
      </bean>
       
      <bean name="userDAO2" class="com.bjsxt.dao.impl.UserDAOImpl">
          <property name="daoId" value="2"></property>
      </bean>
        
      <bean id="userService" class="com.bjsxt.service.UserService" scope="prototype" autowire="byName">
    <!-- 未指定property, 若是byname则自动匹配name等于userDAO的bean,
    若是bytype则匹配类型为userDAO的bean-->

    </bean>
    public class UserDAOImpl implements UserDAO {
        
        private int daoId;
        
        public int getDaoId() {
            return daoId;
        }
    
        public void setDaoId(int daoId) {
            this.daoId = daoId;
        }
    
        public void save(User user) {
        
            System.out.println("user saved!");
        }
        
        @Override
        public String toString() {
            return "daoId=" + daoId;
        }
    
    }

    7,生命周期

    •      lazy-init (不重要)  容器初始化时(ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml")),不初始化,只有用到时才初始化
    <bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"/>
    •      init-method destroy-methd 不要和prototype一起用(了解)
    <bean id="userService" class="com.bjsxt.service.UserService" init-method="init" destroy-method="destroy" scope="singleton">
          <!-- 
          <property name="userDAO" ref="u" />
           -->
           <constructor-arg>
               <ref bean="u"/>
           </constructor-arg>
      </bean>
    public class UserService {
        
        private UserDAO userDAO;  
        
        public void init() {
            System.out.println("init");
        }
        
        public void add(User user) {
            userDAO.save(user);
        }
        public UserDAO getUserDAO() {
            return userDAO;
        }
        public void setUserDAO(UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
        public UserService(UserDAO userDAO) {
            super();
            this.userDAO = userDAO;
        }
        
        public void destroy() {
            System.out.println("destroy");
        }
    }

    8,Annotation第一步:

         修改xml文件,参考文档<context:annotation-config />

    <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-2.5.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd">
        <context:annotation-config />
    <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl">
      </bean>
      <bean id="u2" class="com.bjsxt.dao.impl.UserDAOImpl">
      </bean>
        
      <bean id="userService" class="com.bjsxt.service.UserService" >
          
      </bean>
      
    
    </beans>

    9,@Autowired(自动装配)

    •      默认按类型by type
    •      如果想用byName,使用@Qulifier
    •      写在private field(第三种注入形式)(不建议,破坏封装)
    •      如果写在set上,@qualifier需要写在参数上
    public class UserService {
        
        private UserDAO userDAO;  
        
        public void init() {
            System.out.println("init");
        }
    
        public void add(User user) {
            userDAO.save(user);
        }
        public UserDAO getUserDAO() {
            return userDAO;
        }
        
        @Autowired
        public void setUserDAO(@Qualifier("u") UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
        
        public void destroy() {
            System.out.println("destroy");
        }
    }

    10,@Resource(重要)

    •      加入:j2ee/common-annotations.jar
    •      默认按名称,名称找不到,按类型  @Resource
    •      可以指定特定名称  @Resource(name="u2")
    •      推荐使用
    •      不足:如果没有源码,就无法运用annotation,只能使用xml
    <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-2.5.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd">
        <context:annotation-config />
      <bean id="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl">
      </bean>
      <bean id="u2" class="com.bjsxt.dao.impl.UserDAOImpl">
      </bean>
        
      <bean id="userService" class="com.bjsxt.service.UserService" >
          
      </bean>
      
    
    </beans>
    public class UserService {
        
        private UserDAO userDAO;  
        
        public void init() {
            System.out.println("init");
        }
        
        public void add(User user) {
            userDAO.save(user);
        }
        public UserDAO getUserDAO() {
            return userDAO;
        }
        @Resource(name="u2")
        //@Resource
        public void setUserDAO( UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
    
        
        public void destroy() {
            System.out.println("destroy");
        }
    }

    11,@Component @Service @Controller @Repository  在spring2.5.6中 这四个目前没有区别

    •      初始化的名字默认为类名首字母小写
    •      可以指定初始化bean的名字 @Component("u")
    <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-2.5.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd">
        <context:annotation-config />
        <context:component-scan base-package="com.bjsxt"/>
    </beans>
    @Component("u") //u=new UserDAO()
    public class UserDAOImpl implements UserDAO {
    
        public void save(User user) {
        
            System.out.println("user saved!");
        }
    
    }
    @Component("userService")
    public class UserService {
        
        private UserDAO userDAO;  
        
        public void init() {
            System.out.println("init");
        }
        
        public void add(User user) {
            userDAO.save(user);
        }
        public UserDAO getUserDAO() {
            return userDAO;
        }
        
        @Resource(name="u") //把name=u的UserDAO注入
        public void setUserDAO( UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
    
        
        public void destroy() {
            System.out.println("destroy");
        }
    }

    12,@Scope

    13,@PostConstruct = init-method; @PreDestroy = destroy-method;

    @Scope("singleton")
    @Component("userService")
    public class UserService {
        
        private UserDAO userDAO;  
        
        @PostConstruct
        public void init() {
            System.out.println("init");
        }
        
        public void add(User user) {
            userDAO.save(user);
        }
        public UserDAO getUserDAO() {
            return userDAO;
        }
        
        @Resource(name="u")
        public void setUserDAO( UserDAO userDAO) {
            this.userDAO = userDAO;
        }
        
    
        @PreDestroy
        public void destroy() {
            System.out.println("destroy");
        }
    }
  • 相关阅读:
    Eclipse快捷键 10个最有用的快捷键
    Eclipse--Web项目中 .classpath、mymetadata、project文件的功用
    java.lang.IllegalStateException:Web app root system property already set to different value 错误原因及解决 Log4j
    验证位置时发生错误:“org.tigris.subversion.javahl.ClientException......
    隐藏控制台黑窗口
    APK伪加密
    格蠹汇编-01-blog
    static_cast、dynamic_cast、const_cast和reinterpret_cast总结
    CONTAINING_RECORD宏
    explicit关键字
  • 原文地址:https://www.cnblogs.com/enjoy-life-clh/p/4227485.html
Copyright © 2020-2023  润新知