zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    03-19总结
    JS-DOM
    难题汇总,浮动,伪元素(行级),
    bug汇总
    两栏布局
    表单 form
    a 、ul、 table 标签
    Bootstrap的基本使用(css、js文件的引入)
    6. CSS样式
    5 CSS
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6852475.html
Copyright © 2011-2022 走看看