Spring学习笔记(五)——Spring中常用的注解

Spring中常用的注解:

  • @Autowired :进行自动装配,先通过byType进行自动装配,再通过byName进行自动装配,
    @Autowired(required = false)允许这个bean属性在xml文件不存在(没有在xml文件中配置),默认required=true
  • @Qualifier :搭配@Autowired使用,@Qualifier(value = id) 查找指定id的bean进行自动装配
  • @Resource :进行自动装配,先通过byName进行自动装配,再通过byType进行自动装配,@Resource(name = id) 指定查找指定id的bean装配
  • @Primary :自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

上面几个注解可以看我上一篇关于自动装配的博客,有详细讲解用法,下面我举例说明下 @Primary

定义一个接口:

@Repository
public interface UserDao {
    public void say();
}

定义两个对应的实现类:

@Repository()
public class User1 implements UserDao{
    public void say() {
        System.out.println("User1学Python");
    }
}
@Repository
@Primary
public class User2 implements UserDao{
    public void say() {
        System.out.println("User2学Java");
    }
}

定义一个UserService:

@Service
public class UserService {
    @Autowired
    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

测试:

public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService user = context.getBean("userService", UserService.class);
        user.getUserDao().say();
    }

输出:
在这里插入图片描述
上面的User2使用了@Primary,所以当自动装配时当出现多个Bean候选者时,被作为首选者。

  • @Component :组件,放在类上,说明这个类被Spring管理了,是所有受Spring管理组件的通用形式
  • @Value :为属性显示的赋值
@Component // 等价:<bean id="user" class="pojo.User"></bean>
public class User {
    @Value("周杰伦") // 等价:<property name="name" value="周杰伦"></property>
    private String name;
}
  • @Repository : 功能与@Component相同,但一般用于项目持久层(Dao层)
  • @Service :功能与@Component相同,但一般用于项目业务层(Service层)
  • @Controller : 功能与@Component相同,但一般用于项目控制层(如servlet控制层)
  • @Nullable :标记一个字段,说明允许这个字段的值可以为null
public void setName(@Nullable String name) { // 允许参数name为null
    this.name = name;
}

@Component、@Repository、@Service、@Controller 注解一个bean后,默认这个bean的id为这个类的类名首字母小写(如User它的id为user),但是可以通过@Component(value = “user2”)这种方式自定义它的id,其他三个注解也一样。

  • @Scope() :作用域,默认为单例模式,@Scope(“prototype”)设为原型模式

生命周期:Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作

  • @PostConstruct :作用在void方法上,在构造方法和init方法(如果有的话)之间得到调用,且只会执行一次

  • @PreDestroy :作用在void方法上,注解的方法在destroy()方法调用后得到执行

  • @Lazy(true) :默认为true,用于指定该Bean是否取消预初始化,用于注解类,延迟初始化

  • @Configuration :该类等价与XML中配置beans,相当于Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean,与xml中配置的bean意思一样。

创建一个Config类:

// 被@Configuration注解后,这个Config类会被Spring容器托管,注册到容器中,因为@Configuration底层就是被@Component实现
@Configuration // 该类等价与XML中配置beans,相当于Ioc容器
public class Config {
    public Config() {
        System.out.println("Config初始化");
    }

    // 被@Bean注解后,这个方法的名字就相当于bean标签中的id,返回值类型就相当于bean标签中的class
    @Bean // 与xml中配置的bean意思一样
    public Teacher getTeacher(){
        return new Teacher();
    }
}

创建一个Teacher类:

public class Teacher {
    @Value("张三")
    private String name;

    public Teacher() {
        System.out.println("Teacher初始化");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

测试:

public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        Teacher teacher = (Teacher)context.getBean("getTeacher");
        System.out.println(teacher.getName());
    }

此时必须使用AnnotationConfigApplicationContext(Config.class)获取上下文

结果:
在这里插入图片描述
@Configuration注解的类必需使用<context:component-scanbase-package=”XXX”/>扫描
@Configuration的具体用法参考:https://www.cnblogs.com/duanxz/p/7493276.html.

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值