spring注解

一: 组件类注解

@Repository:当一个组件代表数据访问层(DAO)的时候,我们使用@Repository进行注解
@Repository
public class HappyDaoImpl implements HappyDao{
private final static Logger LOGGER = LoggerFactory.getLogger(HappyDaoImpl .class);
public void  club(){
        //do something ,like drinking and singing
    }
}
@Service:当一个组件代表业务层时,我们使用@Service进行注解
@Service(value="goodClubService")
//使用@Service注解不加value ,默认名称是clubService
public class ClubServiceImpl implements ClubService {
    @Autowired
    private ClubDao clubDao;
  
    public void doHappy(){
        //do some Happy
    }
 }
@Controller:当一个组件作为前端交互的控制层,使用@Controller进行注解
@Controller
public class HappyController {
    @Autowired //下面进行讲解
    private ClubService clubService;
    
    // Control the people entering the Club
    // do something
}
/*Controller相关的注解下面进行详细讲解,这里简单引入@Controller*/

@Component :标准一个普通的spring Bean类。

@Repository:标注一个DAO组件类。

@Service:标注一个业务逻辑组件类。

@Controller:标注一个控制器组件类。 这些都是注解在平时的开发过程中出镜率极高,

@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。

@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    String value() default "";
}

总结:

  • 被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变。@Service也可以自定义Bean名称,但是必须是唯一的!
  •    尽量使用对应组件注解的类替换@Component注解,在spring未来的版本中,@Controller,@Service,@Repository会携带更多语义。并且便于开发和维护!

二:装配bean时常用的注解

@Autowired:属于Spring 的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值

@Resource:不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。

@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作

3、总结
(1):相同点 @Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。

(2):不同点
  a:提供方 @Autowired是Spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。
  b :注入方式 @Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入;
  c:属性
  @Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(bean可用),如果需要改变这种默认方式,可以设置其required属性为false。
还有一个比较重要的点就是,@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合**@Qualifier**注解进行限定,指定注入的bean名称。
@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

  d:@Resource注解的使用性更为灵活,可指定名称,也可以指定类型 ;@Autowired注解进行装配容易抛出异常,特别是装配的bean类型有多个的时候,而解决的办法是需要在增加@Qualifier进行限定。

三:@Component vs @Configuration and @Bean

  • @Configuration:用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration 注解的类.class)。 

      

  • @Component:实例化一个单例对象,交给springIoc管理

  • @Bean:

    作用 : 该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。
    属性: name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id)。

     

 

posted @ 2021-12-08 00:12  *山山_而川  阅读(39)  评论(0)    收藏  举报