SpringBoot注解快速理解

SpringBoot注解

@SpringBootApplication – 主配置类

效果:说明这个类就是SpringBoot的主配置类,SpringBoot就应该运行主配置类的main方法执行程序

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

继承@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

@SpringBootConfiguration:继承@Configuration,Spring配置注解,将当前类声明的一个或多个@Bean注解标记的方法纳入Spring容器,实例名就是方法名

@EnableAutoConfiguration:继承@AutoConfigurationPackage,导入了AutoConfigurationImportSelector.class

AutoConfigurationPackages.Registrar.class

根据添加的jar包来配置项目的默认配置。

@ComponentScan:扫描当前包及其子包下被@Component@Controller@Service@Repository注解标记的类并纳入到spring容器中进行管理

@EnableAutoConfiguration –

效果:借助AutoConfigurationImportSelector.class,为SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

AutoConfigurationImportSelector.class

xxx

@AutoConfigurationPackage

xxx

@AutoConfigurationPackage –

@RestController – 控制器

@RestController == @ResponseBody + @Controller

@ResponseBody:标记在类上,表示类下所有方法返回一条语句给网站,

@Controller:标记当前类为控制器

@RestController
public class SpringbootiniApplication {
    @RequestMapping("/")
    String hello(){
        return "hello world quick";
    }
}

@ConfigurationProperties – 配置属性绑定

全局/主配yml/properties的配置信息注入到POJO(全局 > application.yml/properties)

需要把当前类标记为组件(@Component),添加属性prefix = “xx”,xx为yml里的key

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    int age;
    String name;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
person:
    age: 10

而且根据SpringBoot文档,还需要添加依赖处理器

<!-- yml依赖处理器 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

然后重新启动SpringBoot即可。

(注入失败可能的原因。。。POJO没写getter、setter;没重启SpringBoot、没填prefix指定注入内容;没添加依赖处理器)

说到注入属性,Spring阶段我们常见的注入方式@Value,两者有什么优劣之分呢?

@ConfigurationProperties@Value
功能批量注入配置文件属性单个指定
松散绑定(语法)支持不支持
spEL不支持支持
JSR303校验支持不支持
复杂类型支持不支持

@PropertySource – 引入SpringBoot配置

@ConfigurationProperties需要从副配置文件拿数据时,可用@PropertySource手动引入副配置,value可指定多个路径

@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = {"classpath:person.properties"})
public class Person {
    int age;
    String name;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
  • 相同key优先级:全局配置 > 副配置
  • 上面用person.properties而不用person.yml不是没有原因的,yml除了主配,其他配置不生效

@ImportSource – 引入Spring配置

在SpringBoot中,引入bean.xml(Spring配置文件),需要在主类配置该注解,可导入多个配置文件

@SpringBootApplication
@ImportResource(locations = {"classpath:bean.xml"})
public class SpringbootiniApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootiniApplication.class, args);
    }
}

bean.xml

<!-- bean.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id = "helloService" class="com.suguowen.springbootini.service.HelloService" />
</bans>

@Configuration – 注解代替Spring配置

Spring注解,标记类后当前类成配置类,当前类的@Bean注解即

applicationContext.xml == @Configuration + @Bean + @ComponentSca…

SpringBoot推荐 => 注解代替配置文件

@Configuration
public class MyAppConfig {
    @Bean
    public Student student(){
        System.out.println("@bean is ok");
        return new Student();
    }
}
class Student{}

@Bean:将方法返回值添加到容器中;容器中这个组件默认id就是方法名

@ResponseBody – 文本返回

标注方法上,如果你有返回值,返回值变文本格式输出,若没有标注,则分发器会走视图解析器,然后报错说/template下找不到视图,如果你只是ajax异步回来处理数据存储,不需要返回页面则无需标注

@RequestMapping("/login")
  @ResponseBody
  public User login(User user){
    return user;
  }
  User字段:userName pwd
  那么在前台接收到的数据为:’{“userName”:“xxx”,“pwd”:“xxx”}’

@PathVariable – url取值

若url=localhost:8080/submit/5

则articleId=5

@RequestMapping("/submit/{articleId}")
public void submitModifyArticle(@PathVariable("articleId") int articleId){
### @RequestParam -- data域取值

后台

​```java
@RequestMapping("/submit/{articleId}")
public void submitModifyArticle(  @RequestParam(value = "title")String title,
                                  @RequestParam(value = "html")String html,
                                  @RequestParam(value = "markdown")String markdown){

前端ajax的data域

$("#submit-btn").bind('click',function () {
    var id = [[ ${id} ]];
    var title = [[ ${title} ]];
    var html = testEditor.getHTML();
    var markdown = testEditor.getMarkdown();
   $.ajax({
       url:"/submit/" + id,
       data:{
           title:title,
           html:html,
           markdown:markdown,
       },
       success:function(data){
           window.location.href="/home";
       },
   })
});

@Transactional – 事务

https://blog.csdn.net/nextyu/article/details/78669997

简单的使用方法

只需在方法加上 @Transactional 注解就可以了。

如下有一个保存用户的方法,加入 @Transactional 注解,使用默认配置,抛出异常之后,事务会自动回滚,数据不会插入到数据库。

@Transactional
public void save() {
    User user = new User("服部半藏");
    userMapper.insertSelective(user);

    if (true) {
        throw new RuntimeException("save 抛异常了");
    }
}

@Param – 绑定EL和参数

mybatis提示类型绑定问题

@Select("select * from myuser where loginname=#{loginname} and password=#{password}")
User findWithLoginnameAndPassword(@Param("loginname")int loginname,
                                  @Param("password")String password);
  • 13
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值