首页 > 代码库 > Spring学习笔记_IOC

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");    }}

 

Spring学习笔记_IOC