• Spring注解的使用和组件扫描


    非常重要】 组件扫描(Component-Scan)

    • 通过配置组件扫描,可以使得spring自动扫描package,而不必在spring的配置文件中逐一声明各个<bean>
    • 在配置组件扫描时,指定的包是“根包”,即例如指定了cn.tedu.spring,spring不只会扫描这个包,还会扫描它的各个层级子包,例如:cn.tedu.spring.dao
    • 直接在spring的配置文件中开启组件扫描即可 <context:component-scan base-package="cn.tedu.spring"></context:component-scan>
    • 注意: 仅仅开启组件扫描spring是不会自动管理bean的,而是自动的扫描package,要想自动管理bean,那么还需要配置注解

    注解

    • 在类的声明上方添加@Component注解,可以是的spring知道这个类是一个组件,需要进行管理,所以如过某个类需要被Spring管理,应该将这个类放在被扫描的包中,并且添加注解
    • 由Spring扫描到的组件(由@Component注解标记的类),会由Spring自动设置Bean Id,值为将类名首字母小写的名称,例如组件类的名称是UserDao,则配置的Bean的id是userDao,如果需要自定义Bean,那么可以直接在注解中设置,比如@Component("id")

    前提

    • 一定要是在开启组件扫描的包下使用注解,否则将不会扫描到配置的注解

    常用注解

    • 可以混用,暂时这几个注解没有差异,完全功能相同,但是我们还是要根据规则使用
    • @Component : 通用注解
    • @Service : 用于对业务逻辑类的注解(Service层)
    • @Controller : 用于对控制器类的注解
    • @Repository :用于对持久层处理类的注解(Dao层)
    • @Named :通用注解(不用)
    • 以上5个注解从实现目标和效果是等效的,但是基于方便理解代码的目的,应该按需使用,了;例如对名为UserService类的,应该使用@Service

    其他注解

    @Scope

    • 在类的声明语句上方添加这个注解,用于设置bean的作用域,比如@Scope("prototype")表示非单例,默认是单例

    @Lazy

    • 在单例模式下设置是否懒加载,例如@Lazy("true")用于设置成懒加载
    • 在类的声明语句上方添加
    • 前面之前已经说过,在创建Bean的时候默认使用的是单例模式下的饿汉式的创建,即是在spring配置文件加载的时候创建

    @PostConstruct

    • 将方法设置为生命周期的初始化方法
    • 设置初始化方法,直接在初始化方法的声明语句中添加即可
        
        @PostConstruct   
        public void init(){
            System.out.println("初始化方法");
        }

    @PreDestroy(单例模式下才会销毁)

    • 在方法的声明语句上方使用,可以将这个方法设置为生命周期的销毁方法
    @PreDestroy   
        public void destroy(){
            System.out.println("销毁方法");
        }

    注入值

    @Autowired (不推荐使用)

    • 在类中,在声明属性的上方添加@Autowired,用于标记该属性是自动装配值
    • 这种自动装配默认按照类型(byType)实现自动装配
    • 如果需要按照名称(byName)来自动装配,还需要使用@Qualifier("userDao")来组合使用,注解中配置的名称是需要注入的值的Bean-Id
    • UserDao
    @Repository("userDao")
    public class UserDaoImpl implements UserDao{
        public void reg() {
            System.out.println("reg");
        }
    }
    • UserService
    @Service
    public class UserService {
        @Autowired
        @Qualifier("userDao")
        private UserDao userDao;
        public void reg(){
            userDao.reg();
        }
    }

    @Resource (推荐使用)

    • 在需要注入的属性的上方添加该注解
    • 默认先按照名称来自动装配的(byName),如果名称对应不上,那么按照类型(byType)进行匹配
        @Resource   
        private UserDao userDao;
    • 如果使用@Resource(name="userDaoImpl"),name属性指定的是Bean Id,添加了name属性,那么只是按照名称来装配,如果这个名称对应的Bean不存在,那么就注入失败
        @Resource(name="userDaoImpl")   
        private UserDao userDao;

    @Value

    • 使用@Value注解添加在属性的声明的上方,可以对属性注入值
    • 直接注入值
        @Value("陈加兵")
        private String name;
    • 在使用@Value("#{beanId.属性名}")的注解时还可以使用Spring表达式

    https://cloud.tencent.com/developer/article/1120386

  • 相关阅读:
    设计师
    仅用递归函数和栈操作逆序一个栈
    用两个栈实现队列
    设计一个有getMin功能的栈(2)
    设计一个有getMin功能的栈(1)
    Java 泛型
    servlet里获得jsp页面里select的选项之值
    mac上mysql的GUI工具sequel pro
    mac安装mysql的两种方法(含配置)
    [转]在Mac系统中安装配置Tomcat及和Eclipse 配置
  • 原文地址:https://www.cnblogs.com/feng9exe/p/12074524.html
Copyright © 2020-2023  润新知