Spring注解(包含SpringBoot)

1. @SpringBootApplication(作用在启动类上)

声明让spring boot自动给程序进行必要的配置,这个配置等同于:@Configuration + @EnableAutoConfiguration + @ComponentScan 三个配置。
例如:
@SpringBootApplication
/*@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = "com.jamy.song.demo")*/
public class SpringThreadApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringThreadApplication.class, args);
    }
}

2. @EnableAutoConfiguration(作用在启动类上)

SpringBoot自动配置(auto-configuration):尝试根据你添加的jar依赖自动配置Spring应用。
例如,如果classpath下存在HSQLDB,并且你没有手动配置任何数据库连接beans,那么我们将自动配置一个内存型(in-memory)数据库。
也可以将@EnableAutoConfiguration或者@SpringBootApplication注解添加到一个@Configuration类上来选择自动配置。
如果发现应用了你不想要的特定自动配置类,你可以使用@EnableAutoConfiguration注解的排除属性来禁用它们

3. @ComponentScan(作用在启动类上)

表示将该类自动发现扫描组件,可以指定扫描范围。如果扫描到有@Component@Controller@Service等这些注解的类,并注册为Bean,可以自动收集所有的Spring组件,包括@Configuration类。当使用@ComponentScan注解搜索beans,结合@Autowired注解导入。如果没有配置的话,Spring Boot会扫描启动类所在包下以及子包下的使用了@Service,@Repository等注解的类.
例如:
//@SpringBootApplication
@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = "com.jamy.song.demo")
public class SpringThreadApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringThreadApplication.class, args);
    }
}

4. @Configuration(作用在启动类上、配置类上)

相当于传统的xml配置文件,如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。
例如:
@Configuration
/*@MapperScan(basePackages = "com.jamy.song.demo.dao",
        sqlSessionFactoryRef = "sqlSessionFactory"
)*/
@PropertySource(value="classpath:jdbc.properties")
public class MyDataSource {
    private static ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

    @Value(value="${db.username}")
    private String username;
    @Value(value="${db.password}")
    private String password;
    @Value(value="${db.url}")
    private String url;
    @Value(value="${db.driverClassName}")
    private String driverClassName;
    @Value(value="${db.jdbcType}")
    private String jdbcType;

    @Bean
    public DruidDataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        dataSource.setDbType(jdbcType);
        return dataSource;
    }

    @Bean
    public FactoryBean<SqlSessionFactory> sqlSessionFactory() throws IOException {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(this.dataSource());
        factoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
        return factoryBean;
    }

    public DataSourceTransactionManager transactionManager(){
        DataSourceTransactionManager txMgr = new DataSourceTransactionManager();
        txMgr.setDataSource(this.dataSource());
        return txMgr;
    }
}

5. @Controller(作用在控制器类上)

用于定义控制器类,在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层),一般这个注解在类中,通常方法需要配合注解@RequestMapping
例如:
@Controller
public class DemoController {
    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private Job userJob;

    @RequestMapping("/queryUser")
    @ResponseBody
    public String queryUser() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {

        JobParameters jobParameters = new JobParametersBuilder().addDate("date", new Date()).toJobParameters();

        jobLauncher.run(userJob, jobParameters);

        return "success";
    }
}

6. @RestController(作用在控制器类上)

用于标注控制层组件(如struts中的action),是@ResponseBody + @Controller的合集。

7. @Service((作用在服务(业务)类上))

一般用于修饰service层的组件

8. @Repository(作用在类上)

使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项

9. @Component(作用在类上)

泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
例如:
@Component
@StepScope
public class MyListener implements StepExecutionListener {

    Map<String, JobParameter> parameters;


    @Override
    public void beforeStep(StepExecution stepExecution) {
        parameters = stepExecution.getJobParameters().getParameters();
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        return null;
    }

    public Map<String, JobParameter> getParameters(){
        return parameters;
    }
}

10. @Bean(作用在方法上)

@Bean标注方法等价于XML中配置的bean,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。
例如:
@Configuration
@EnableBatchProcessing
public class UserBatchDemo {

    private Logger logger = LoggerFactory.getLogger(UserBatchDemo.class);

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private UserDao dao;
    @Autowired
    private MyListener listener;

    @Bean
    public Job userJob(){
        return jobBuilderFactory.get("userJob")
                .incrementer(new RunIdIncrementer()) //设置job的id保证每一次执行都是唯一的(可重复执行)
                .flow(userStep())
                .end()
                .build();
    }

    @Bean
    public Step userStep() {
        return stepBuilderFactory.get("userStep")
                .listener(listener)
                .<User, User>chunk(1)
                .reader(userRead())
                .writer(new UserWriter())
                .build();
    }

    @Bean
    @StepScope
    public UserItemReader userRead() {
        System.out.println(listener.getParameters());
        List<User> list = dao.queryUser();
        return new UserItemReader(list);
    }
}

11. @AutoWired(作用在属性上)

自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。和@Resource用法差不多,只不过它是按类型注入的
例如:
@Service
public class UserService {

    @Autowired
    private Schedule schedule;
    @Autowired
    private UserDao userDao;

    ExecutorService executorService = Executors.newFixedThreadPool(10);

    public void addUser(JSONObject jsonObject){

        schedule.setProperties(userDao, jsonObject);
        executorService.submit(schedule);

    }
}

12. @Resource(name=”name”,type=”type”,作用在属性上)

没有括号内内容的话,默认按byName注入。与@Autowired作用差不多。

13. @Qualifier(作用在属性上)

当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用。@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者
例如:
@Service
public class UserService {

    @Autowired
    @Qualifier(value="schedule")
    private Schedule schedule;
    @Autowired
    private UserDao userDao;

    ExecutorService executorService = Executors.newFixedThreadPool(10);

    public void addUser(JSONObject jsonObject){

        schedule.setProperties(userDao, jsonObject);
        executorService.submit(schedule);

    }
}

14. @RequestMapping(作用在方法上)

提供路由信息,负责URL到Controller中的具体函数的映射
例如:
@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("addUser")
    @ResponseBody
    public String addUser() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", "zhangsan");
        jsonObject.put("age", 21);
        jsonObject.put("address", "上海市浦东新区松涛路80号");
        userService.addUser(jsonObject);
        return "hello world";
    }

}

15. @ResponseBody(作用在方法上)

表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,用于构建RESTful的api。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@Responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@Responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用
例如:
@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("addUser")
    @ResponseBody
    public String addUser() {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name", "zhangsan");
        jsonObject.put("age", 21);
        jsonObject.put("address", "上海市浦东新区松涛路80号");
        userService.addUser(jsonObject);
        return "hello world";
    }

}

16. @Import

用来导入其他配置类。

17. @ImportResource

用来加载xml配置文件

18. @PropertySource(作用在类上)

用来加载application.properties外的普通配置文件,例如jdbc.properties
例如:
@Configuration
@PropertySource(value="classpath:jdbc.properties")
public class MyDataSource {
    private static ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

    @Value(value="${db.username}")
    private String username;
    @Value(value="${db.password}")
    private String password;
    @Value(value="${db.url}")
    private String url;
    @Value(value="${db.driverClassName}")
    private String driverClassName;
    @Value(value="${db.jdbcType}")
    private String jdbcType;

    @Bean
    public DruidDataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        dataSource.setDbType(jdbcType);
        return dataSource;
    }

    @Bean
    public FactoryBean<SqlSessionFactory> sqlSessionFactory() throws IOException {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(this.dataSource());
        factoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
        return factoryBean;
    }

    public DataSourceTransactionManager transactionManager(){
        DataSourceTransactionManager txMgr = new DataSourceTransactionManager();
        txMgr.setDataSource(this.dataSource());
        return txMgr;
    }

}

19. @Value(作用在属性上)

注入Spring boot application.properties配置的属性的值
例如:
@Configuration
/*@MapperScan(basePackages = "com.jamy.song.demo.dao",
        sqlSessionFactoryRef = "sqlSessionFactory"
)*/
@PropertySource(value="classpath:jdbc.properties")
public class MyDataSource {
    private static ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

    @Value(value="${db.username}")
    private String username;
    @Value(value="${db.password}")
    private String password;
    @Value(value="${db.url}")
    private String url;
    @Value(value="${db.driverClassName}")
    private String driverClassName;
    @Value(value="${db.jdbcType}")
    private String jdbcType;

    @Bean
    public DruidDataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        dataSource.setDbType(jdbcType);
        return dataSource;
    }
}

20. @Inject

等价于默认的@Autowired,只是没有required属性

21. @PathVariable(作用在属性上)

获取参数

22.@Mapper

用来注解数据持久化接口(dao接口)
例如:
@Mapper
public interface UserDao {

    List<User> queryUser();
}

23. @MapperScan

用来扫描数据持久化接口包(dao包)
例如:
@SpringBootApplication
@EnableScheduling
@MapperScan(basePackages = "com.jamy.song.demo.dao",
        sqlSessionFactoryRef = "sqlSessionFactory"
)
public class ApplicationDemo {

    public static void main(String[] args) {
        SpringApplication.run(ApplicationDemo.class, args);
    }
}

版权声明:本文为u010080562原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。