SpringBoot注解

SpringBoot仅仅是一个“胶水”,一种使用注解来替代XML配置的库。它的注解其实是SpringMVC的注解。

一、三层架构:控制层、服务层、业务层

控制层Controller:调用Service层
服务层Service:调用Repository层
业务层Repository:DAO层

@Component 对那些比较中立的类进行注释

1、@controller 控制器(注入服务)
2、@service 服务(注入dao)
3、@repository dao(实现dao访问)
4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的

@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。
下面写这个是引入component的扫描组件
<context:component-scan base-package=”com.mmnc”>

其中base-package为需要扫描的包(含所有子包)
1、@Service用于标注业务层组件
2、@Controller用于标注控制层组件(如struts中的action)
3、@Repository用于标注数据访问组件,即DAO组件.
4、@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Service public class UserServiceImpl implements UserService { }
@Repository public class UserDaoImpl implements UserDao { } getBean的默认名称是类名(头字母小写),如果想自定义,可以@Service(“***”) 这样来指定,这种bean默认是单例的,如果想改变,可以使用@Service(“beanName”)
@Scope(“prototype”)来改变。可以使用以下方式指定初始化方法和销毁方法(方法名任意): @PostConstruct public void init() { }

在标注组件等资源时候,可以加上名称例如 @Component("stuDaoImpl") 。默认的名称是 类名首字母小写。但是最好直接使用默认名称。

import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.bjsxt.dao.*;
import com.bjsxt.model.Student;
@Component("stuDaoImpl")
public class StudentDaoImpl implements StudentDao{
	@Override
	public void StudentSave(Student s) {
          System.out.println("学生被保存!");
	}
}

使用Bean注入有两种方式:

  • 按照类型(默认,一般够用)
  • 按照名称(更加灵活,一个类型可以有多种Bean,比如一个接口有两个实现类)

在测试中,不能使用new的方式来创建Component,那样会导致Component中的某些属性没有被注入。正确姿势之一是:Context#getBean

二、@Autowired@Resource的区别

1、@Autowired@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
注意:放在setter方法上就是多此一举,肯定放在字段上更直观更简单。
2、@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:

@Autowired() @Qualifier("baseDao")     
private BaseDao baseDao;    

3、@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定,
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Resource(name="baseDao")     
private BaseDao baseDao;    

我喜欢用@Resource注解在字段上,且这个注解是属于J2EE的,减少了与spring的耦合。最重要的这样代码看起就比较优雅。

三、静态注入

将Bean作为成员变量,若需要自动注入,必须给Bean加上Component、Controller、Service、Repository类型的注解。

定义一个类A,它有一个属性haha。

@Component
class A{
  @Value("${haha}")
  String haha;
}

定义一个类B,他有一个属性A

@Component 
class B{
  @Resource
  A a;
}

在类中使用@Value注解读取属性,必须将A定义为Component类型的,这样Spring才会检查A类中的Value注解。
在B类中,要想让Spring检查@Resource@Autowired注解,就必须将B定义为Component类型。
要想将A a;自动注入,需要满足条件:Spring知道A类型,也就是说A类型必须是Component,这样Spring的Bean仓库中才有这样的Bean

自动注入有两种注解,它们使用上差别不大:

  • @autowired是Spring的注解
  • @Resource是Java自带的注解

自动注入有两种写法:

  • 直接注解成员变量
  • 注解setter方法,这种方式实际上是Spring调用setter方法,传递的参数就是需要注入的那个Bean

注解setter方法是更加通用的方法,注解成员变量是更加简便的方法。
下面举例说明:
方式一:

class B{
  @Resource
  A a;
}

方式二:

class B{
  @Resource
  void setA(A a){
    this.a=a;
  }
  A a;
}

跟方式一直接注解属性相比,方式二注解setter方法看上去多此一举,而实际上,方式二更加灵活。
请看如下两个场景:
场景一:对注入的Bean做一定的更改

class B{
  @Resource
  void setA(A a){
    a.setName("haha");//对注入的对象做一定的更改
    this.a=a;
  }
  A a;
}

场景二:注入静态成员变量
对于静态成员变量,即便使用@Resource进行注解,Spring并不会为你自动注入。

class B{
  @Resource
  void setA(A a){
    a.setName("haha");//对注入的对象做一定的更改
    B.a=a;//对静态成员进行注入
  }
  static A a;
}
原文地址:https://www.cnblogs.com/weiyinfu/p/6852475.html