博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring常用注解
阅读量:6860 次
发布时间:2019-06-26

本文共 3121 字,大约阅读时间需要 10 分钟。

1、spring传统配置与注解

传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:

1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低。

2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率。为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与JavaBean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。

2、spring常用注解认识

  • @Controller:这个注解用在MVC模式下的的controllerc层(控制层),使用@Controller注解标识一个controller后,表示将该controller交给spring容器来管理,spring容器中会存在一个controller实例。
  • @Service:这个注解对应的是mvc模式下的'service层(业务层)',使用@Service注解标识一个业务层bean时,表示将该bean交友spring容器管理,当controller层需要调用service时,只需在controller层声明service变量,然后注入即可
  • @Repository:这个注解用在mvc模式下的dao层(持久层)。实际开发中则用在操作数据库的dao实现类和model上。
  • @Component:这个注解是一个通用注解,它可以代表@Controller@ServiceRepository,当你不知道一个类要用什么来注解时,就用它
  • @Scope:这个注解和spring配置文件中的 scope 属性是一个意思,它代表这一个bean的作用域
  • @value:这个属性用在给pojo类属性赋值时使用,如果注解标识在属性上面则sspring底层是用java反射机制来给属性赋值,如果注解标识在setter方法上,则调用set方法来赋值,与配置文件中的<property>标签注入时一样的效果。
  • @Resource:这个注解用法和@value很像,当在一个bean中要注入另外一个bean时就用这个注解,同样是可以在属性上,也可以在setter方法上去标识。它有属性name,可以用来指定注入的bean,使用byName的自动注入策略,'type'属性可以用来指定注入的类型,使用byType自动注入策略,当该类型有两个或以上实例时就会出错。如果不指定属性的话,默认使用反射机制byName的自动注入策略。
  • @Autowired:这个注解是spring提供的注解,同样可以在属性字段和setter方法上使用。它属于自动注入,只支持byType装配依赖对象,默认情况下它要求依赖对象必须存在,不可为null,可以通过设置它的属性requiredfalse,来使依赖对象允许为空。如果想通过byName来装配依赖对象,可以与@Qualifier注解结合使用。
  • @Qualifier:这个注解常与@Autowired结合使用,在自动装配时可以用来支持byName装配策略

    3、常用注解的使用

    在使用注解之前,要在spring配置文件中插入

    它表示扫描这个路径下的包和类的注解,即表示这个路径下的类可以使用注解

    1、@Controller、@Service、@Repository、@Component、@Scope

    User

    @Component  @Scope("prototype")  public class User {  }

    UserController

    @Controller  public class UserController {  }

    UserService

    @Service("userService")  public class UserServiceImpl implements UserService {  }

    UserDao

    @Repository("userDao")  public class UserDaoImpl implements UserDao {  }

测试结果

1121080-20190429183526023-647084405.png

2、@value

User

@Component@Scope("prototype")public class User {        @Value("小明")    private String name;    private String sex;        public User() {        super();        System.out.println("User类构造器被调用");    }    public String getName() {        return name;    }        public void setName(String name) {        this.name = name;        System.out.println("调用setName方法");    }    public String getSex() {        return sex;    }    @Value("男")    public void setSex(String sex) {        this.sex = sex;        System.out.println("调用setSex方法");            }    @Override    public String toString() {        return "User [name=" + name + ", sex=" + sex + "]";    }}

测试结果

1121080-20190429183531524-1533344053.png

3、@Resource(这里先介绍简单的使用,后续博客在详细介绍)

Pet

@Componentpublic class Pet {    @Value("1000")    private int id;    //宠物类型    @Value("小狗")    private String type;        @Override    public String toString() {        return "Pet [id=" + id + ", type=" + type + "]";    }}

User

@Component@Scope("prototype")public class User {        @Value("小明")    private String name;    @Value("男")    private String sex;        @Resource    private Pet pet;    @Override    public String toString() {        return "User [name=" + name + ", sex=" + sex + ", pet=" + pet + "]";    }    }

测试结果

1121080-20190429183537558-572557047.png

4、@Autowired、@Qualifier

主体代码与3相同,稍做修改即可,结果也一样

1121080-20190429183547954-1326393022.png

转载于:https://www.cnblogs.com/hamawep789/p/10792199.html

你可能感兴趣的文章
带参有返回值方法-求1!+2!+3!+4!+5!
查看>>
How to take partial screenshot with Selenium WebDriver in python
查看>>
关于学习
查看>>
Testing - 软件测试知识梳理 - 测试阶段
查看>>
[JZOJ3105]拼图
查看>>
浙江自考本科的一些事项(一)
查看>>
DevOps最佳工具集实践
查看>>
mysql服务器硬件配置选择参考
查看>>
C# Azure 用Webhook添加警报规则
查看>>
二进制、十进制、N进制 ○| ̄|_
查看>>
Linux磁盘挂载
查看>>
使用index+Match函数组合实现反向、双向等复杂的表格查找
查看>>
数据库与数据仓库的区别
查看>>
BZOJ 3998 [TJOI2015]弦论
查看>>
【C语言】19-static和extern关键字1-对函数的作用
查看>>
MapReduce Input Split(输入分/切片)详解
查看>>
Java Arrays.asList注意事项
查看>>
LeetCode 359 Logger Rate Limiter
查看>>
Windows核心编程04-字符编码
查看>>
mysqlcluster笔记
查看>>