Spring中常用的注解


前言

大家应该都知道Spring的一大核心思想就是IOC控制反转,可以通过applicationContext.xml的方式管理很多bean,但是一旦管理的bean多了,配置文件就会显得很冗余,所以spring又提供了更好的方式解决这个问题——注解。


一、配置类

1.1 @Configuration

含义:配置类
注意测试时需要配合AnnotationConfigApplicationContext加载“主”配置类

// 表明此类是配置类
@Configuration
public class ApplicationConfig {
}

1.2 @ComponentScan

作用:等同于配置文件中的<context:component-scan base-package=“”></context:component-scan>,扫描base-package路径下的所有注入类
用法:@ComponentScan(basePackages = {“com.apesource”})

@Configuration
@ComponentScan(basePackages = {"com.apesource"})
public class ApplicationConfig {
}

1.3 @PropertySource

作用:等同于配置文件中的<context:property-placeholder location=“”></context:property-placeholder>,加载路径中的properties文件获取键值对的key
用法:@PropertySource(value = “classpath:msg.properties”)

//此时是一个新配置类
@Configuration
@PropertySource(value = "classpath:msg.properties")
public class DataApplicationConfig {
}

1.4 @Import

作用:导入其他配置类,可以将配置类分的更散,最终通过@Import加载到一个“主”配置类中,更加灵活
用法:@Import(DataApplicationConfig.class)

@Configuration
@ComponentScan(basePackages = {"com.apesource"})
@Import(DataApplicationConfig.class)
public class ApplicationConfig {
}

1.5 @Bean

作用:注入类,它常用在注入java已有的类(方法返回值为class 方法名称为id);例如:Date
位置:方法上方
注意:单独使用,无需扫描

@Configuration
@ComponentScan(basePackages = {"com.apesource"})
@Import(DataApplicationConfig.class)
public class ApplicationConfig {
	@Bean
    public Date getDate(){
        return new Date();
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        Date date = (Date) applicationContext.getBean("getDate");
        System.out.println(date);
    }
}

测试结果:
在这里插入图片描述

二、注入类

2.1 @Component

含义:将注解所修饰的类注入spring容器
位置:类上方
语法:@Component(value = “id”)

  • 如果省略value=“id"默认注入的id为类的名称且首字母小写
    注意:不可以单独使用
    需要配合<context:component-scan base-package=”"></context:component-scan>或@ComponentScan
@Component
public class Love {
}

//测试
public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        Love love = (Love) applicationContext.getBean("love");
        System.out.println(love);
    }
}

测试结果:
在这里插入图片描述

2.2 @Repository 、@Service、@Controller

  • @Repository注入数据访问层
  • @Service注入业务层
  • @Controller 注入控制层

以上以上三个注解与**@Component**功能语法一致,目的是为了更好区分不同层级;
下面是不同层级的接口以及实现类

public interface IUserDao {
    public void save();
}
@Repository
public class UserDaoImp implements IUserDao{
    @Override
    public void save() {
        System.out.println("===dao数据访问层===");
    }
}
public interface IUserService {
     public void save();
}
@Service
public class IUserServiceImp implements IUserService{

    IUserDao iUserDao;

   @Override
   public void save() {
       System.out.println("===service业务逻辑层===");
       iUserDao.save();
   }
}
public interface IUserController {
    public void save();
}

@Controller 
public class UserControllerImp implements IUserController {

    IUserSerivce serivce;


    @Override
    public void save() {
        System.out.println("===controller控制访问层===");
        serivce.save();
    }
}

2.3 @Value、@Autowired

  • @Value
    • 含义:向属性注入基本类型与String
      语法:@Value(“数据”)或@Value(“${key}”)
      位置:属性
      注意:不能单独使用
      <context:property-placeholder location=“”></context:property-placeholder>或@PropertySource
  • @Autowired
    • 替换:自动装配属性
      位置:属性
      含义:通过“set”方法【set方法可以省略】,按照“类型”自动装配,如果类型冲突则按照"名称"装配
      注意: 1.按类型装配如果冲突切换为名称装配 2.按类型装配如果冲突切换为名称装配,如果名称也没有则会抛异常NoUniqueBeanDefinitionException 3.3.按类型装配没一个匹配NoSuchBeanDefinitionException
public interface IUserDao {
    public void save();
}
@Repository
public class UserDaoImp implements IUserDao{
    @Override
    public void save() {
        System.out.println("===dao数据访问层===");
    }
}
public interface IUserService {
     public void save();
}
@Service
public class IUserServiceImp implements IUserService{
	@Autowired
    IUserDao iUserDaoImp;

   @Override
   public void save() {
       System.out.println("===service业务逻辑层===");
       iUserDaoImp.save();
   }
}
public interface IUserController {
    public void save();
}

@Controller(value="controller") 
public class UserControllerImp implements IUserController {
	@Autowired
    IUserSerivce serivce;


    @Override
    public void save() {
        System.out.println("===controller控制访问层===");
        serivce.save();
    }
}

@Component
public class Love {
    @Value("${msg1}")
    private String love1;
    @Value("${msg2}")
    private String love2;

    @Override
    public String toString() {
        return "Love{" +
                "love1='" + love1 + '\'' +
                ", love2='" + love2 + '\'' +
                '}';
    }
}
//测试
public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        Love love = (Love) applicationContext.getBean("love");
        System.out.println(love);

        IUserController iUserController = (IUserController) applicationContext.getBean("controller");
        iUserController.save();
    }
}

测试结果:
在这里插入图片描述

三、其他常用注解

3.1 @Primary

含义:在类型装配冲突的情况下,此注解所修饰的类作为首选项
位置:类上方
注意:不可以单独使用,需要配合注入类使用

3.2 @Qualifier和@Resource

  • @Qualifier
    • 含义:按照名称装配
      语法:@Qualifier(value = “名称”)
      位置:属性
      注意:不能单独使用,需配合**@Autowired**使用
  • @Resource
    • 含义:按照名称装配
      语法:@Resource(name = “名称”)
      位置:属性
      作用:等同于**@Autowired@Qualifier**一起使用的效果

3.3 @Scope

含义:作用域
位置:类
注意:不能单独用
默认:单例
举例:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 或@Scope(“prototype”)

3.4 @PostConstruct

含义:替换bean标签中的init-method
位置:方法
注意:单独用

3.5 @PreDestroy

含义:替换bean标签中的destory-method
位置:方法
注意:单独用


总结

以上就是spring框架常用的基础注解了,通过这些注解,可以很好的解决代码臃肿的问题,并且很好的使对象之间产生了松散耦合的关系,使得更加灵活,简洁。(缺点是可读性降低)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值