spring学习笔记-2

来源:互联网 发布:高仿卡西欧手表淘宝店 编辑:程序博客网 时间:2024/05/16 09:04
##基于注解(Annotation-based)的配置
    要使得配置可用,需在xml的命名空间加入:
<?xml version="1.0" encoding="UTF-8"?>       <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/>    </beans>
    ##@Resource

1.beans.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>    <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.dao.impl.UserDAOImpl">      </bean>      <bean id="u2" class="com.dao.impl.UserDAOImpl">      </bean>          <bean id="userService" class="com.service.UserService" >           </bean> </beans>
    2.@Resource有一个‘name’属性,缺省时,Spring 将这个值解释为要注射的 bean 的名字。换句话说,如果遵循by-name的语法,如下例:
public class SimpleMovieLister {     private MovieFinder movieFinder;     @Resource(name="myMovieFinder")     public void setMovieFinder(MovieFinder movieFinder) {           this.movieFinder = movieFinder;     } }
    如果没有显示的给出名字,它会首先按照by-name去找,name值为:属性名,如下面名字就是:moveFinder,如果找不到它会遵循by-type的语法,因此上面的beans.xml文件不能有2个相同类型的Bean,
public class SimpleMovieLister {            private MovieFinder movieFinder;            @Resource            public void setMovieFinder(MovieFinder movieFinder) {                this.movieFinder = movieFinder;            }}
        修改xml文件:
        <bean id="u" class="com.dao.impl.UserDAOImpl"></bean>
          <bean id="u2" class="com.dao.impl.UserDAOImpl"></bean>    
        去掉其中一个Bean。
##@Component
    一个Component的例子:
    1.beans.xml文件
<?xml version="1.0" encoding="UTF-8"?>    <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"/>    </beans>
    2.UserDAOImpl.java
package com.dao.impl;    import org.springframework.stereotype.Component;    import com.dao.UserDAO;    import com.model.User;    @Component("u")     public class UserDAOImpl implements UserDAO {        public void save(User user) {            System.out.println("user saved!");        }}
    他代替了配置文件里的:<bean id="u" class="com.dao.impl.UserDAOImpl"></bean>这句话
 3.UserService.java
package com.service;    import javax.annotation.Resource;    import org.springframework.beans.factory.annotation.Autowired;    import org.springframework.beans.factory.annotation.Qualifier;    import org.springframework.stereotype.Component;    import com.dao.UserDAO;    import com.model.User;        @Component("userService")    public class UserService {            private UserDAO userDAO;          public void add(User user) {            userDAO.save(user);        }        public UserDAO getUserDAO() {            return userDAO;        }        @Resource(name="u")        public void setUserDAO( UserDAO userDAO) {            this.userDAO = userDAO;        }    }
    这里的配置代替了XML文件的: <bean id="userService" class="com.service.UserService" > 
        <property name="userDAO" ref="u"></property>
      </bean>
    4.UserServiceTest.java
 package com.service;    import org.junit.Test;    import org.springframework.context.support.ClassPathXmlApplicationContext;    import com.model.User;    public class UserServiceTest {        @Test         public void testAdd() throws Exception {            ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");            UserService service = (UserService)ctx.getBean("userService");            service.add(new User());            ctx.destroy();        }    }
    运行结果为:User save!
    Component一般要求后面加入一个名字,如果没有加,默认是:类名首字母小写。
    ##Scope
    通常受Spring管理的组件,默认或者最常用的作用域是“singleton”。然而,有时也会需要其他的作用域。 因此Spring 2.5还引入了一个新的@Scope注解。只要在注解中提供作用域的名称就行了, 比方说:
 @Scope("prototype")    @Component("userService")    public class UserService {            private UserDAO userDAO;          public void add(User user) {            userDAO.save(user);        }        public UserDAO getUserDAO() {            return userDAO;        }        @Resource(name="u")        public void setUserDAO( UserDAO userDAO) {            this.userDAO = userDAO;        }    }
##@PostConstruct and @PreDestroy
    @PostConstruct
    public void init() {
        System.out.println("init");
    }
    表示在初始化之前会执行init()方法。

    @PreDestroy
    public void destroy() {
        System.out.println("destroy");
    }
    表示在容器销毁之前会执行destroy()。
0 0
原创粉丝点击