文章目录
- SpringBoot注解
- @SpringBootApplication -- 主配置类
- @EnableAutoConfiguration --
- @AutoConfigurationPackage --
- @RestController -- 控制器
- @ConfigurationProperties -- 配置属性绑定
- @PropertySource -- 引入SpringBoot配置
- @ImportSource -- 引入Spring配置
- @Configuration -- 注解代替Spring配置
- @ResponseBody -- 文本返回
- @PathVariable -- url取值
- @Transactional -- 事务
- @Param -- 绑定EL和参数
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);