`

spring Annotation

 
阅读更多

Annotation
Annotation头文件配置

<?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-3.0.xsd
              http://www.springframework.org/schema/context
              http://www.springframework.org/schema/context/spring-context-3.0.xsd">   
			 
         <context:annotation-config/>    
   </beans> 

<context:annotation-config/>讲解
     当spring容器启动后会依据这句话初始化四个处理spring Annotation有关的类。

 

Annotation xml文件代码提示
     preferences--xml--xmlCatalog--add加入spring-context.xsd
     Location=""  keyType="schema location"   key="http://www.springframework.org/schema/context/fileName.xsd"

 

@Autowired 运用的不是很多,会产生很多问题
     概述:注入方式byType,spring会在程序代码中有@Aurowired的地方从容器的beans仓库中注入一个与参数类型相同的bean,与参数bean的Name无关。
              需要注意的是,保证beans仓库中有该类型的实例,为了实现这一点我们需要使用<bean>标签来或者使用完全注解的方式让spring实例化
                    一个该参数类型的bean。
   构造方法:类A,子属性B(通过注入得到),要确保类A有无参的构造方法。
   说明:@Autowired可放在属性和方法前,但属性注入破坏了程序的封装性不推荐使用

public class MovieRecommender 
   {
     private Set<MovieCatalog> movieCatalogs;    
     @Autowired
     public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) 
	   { this.movieCatalogs = movieCatalogs;}
   }

@Qualifier
      概述:当spring的beans仓库中有多个类型相同的bean时,@Autowired注入就会出错,@Querlifier可指定bean的id。在<bean>中id默认可作为
                   <quarlifier value="" />中的value
     代码提示:preferences--java--content assist--for java:.@ 、for javadoc:#
     示例:

/*
 <bean id="userDaoA" class="com.ssj.dao.UserDao"></bean>
  <bean id="userDaoB" class="com.ssj.dao.UserDao"></bean>
*/
   public class UserService 
   {
     private UserDao userDao;    
     @Autowired
     public void setUserDao( @Qualifier("userDaoA")UserDao userDao) 
	   { this.userDao = userDao;}
   }

 
@Resource 推荐使用resource
     概述:J2EE定义的注解,需要引入common-annotation.jar。Spring also supports injection using the JSR-250 @Resource annotation on
                 fields or bean property setter methods.
             默认是byName注入(autowired是byType),
    spring容器会将<bean name="">标签的name属性value作为@Resource的name属性值(会将id属性值作为qualifier的value属性值),当不指定
            resource的name属性时,参数名称对应<bean >标签的name属性
    示例:

/*
1、<bean id="userDaoA" name="userDaoA" class="com.ssj.dao.UserDao"></bean>
                <bean id="userDaoB" name="userDaoB" class="com.ssj.dao.UserDao"></bean>
*/
public class UserService 
			{
			   private UserDao userDao;    
			   @Resource(name="userDaoA")
			   public void setUserDao( UserDao userDao) 
				  { this.userDao = userDao;}
			}
/*
2、<bean id="userDaoA" name="userDaoA" class="com.ssj.dao.UserDao"></bean>
                   <bean id="userDaoB" name="userDaoB" class="com.ssj.dao.UserDao"></bean>
*/

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

全注解配置:
      配置文件:

<?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-3.0.xsd
              http://www.springframework.org/schema/context
              http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
		  
		  <context:annotation-config/>
          <context:component-scan base-package="com.ssj"/>   <!--扫描com.ssj下的所有包-->
   </beans>

    概述:spring容器通过<context:component-scan base-package="com.ssj"/>此句会扫描该包下的类
                 ,在有@Component、@Controller、
          @Service、@Repository标注的地方就试图实例化该类并存入beans仓库中,若并显示指定对象
              名容器会依据类名建立实例化的对象。

 

@Component、@Controller、@Service、@Repository当某个类不在或分不清在MVC那个层中,用
@Component标注
      示例:

 //@Repository("myUserDao")
   @Repository
   public class UserDao
   {//.......}
   
   @Service("myUserService")
   @Service
   public class UserService 
   {
     private UserDao userDao;    
     @Resource
     public void setUserDao(UserDao userDao) 
	   { this.userDao = userDao;}
	 /*
	 @Resource(name="myUserDao")
     public void setUserDao(UserDao userDao) 
	   { this.userDao = userDao;}
	 */
	 
	 /*
	 @Resource
     public void setUserDao(UserDao myUserDao) 
	   { this.userDao = myUserDao;}
	 */
   }

 

@Scope   :@Scope("singleton")  @Scope("prototype")
         示例:

@Scope("singleton")
    @Service
   public class UserService 
   {
     private UserDao userDao;    
     @Resource
     public void setUserDao(UserDao userDao) 
	   { this.userDao = userDao;}

     @PostConstruct
	 public void conAfter() 
	   { System.out.println("构造完成");}
     @PreDestroy
	 public void desBefore() 
	   { System.out.println("即将销毁");}
   }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics