1.1SpringBoot环境配置和常⽤注解
Spring Boot常⽤注解:
@Service: 注解在类上,表⽰这是⼀个业务层bean
@Controller:注解在类上,表⽰这是⼀个控制层bean
@Repository: 注解在类上,表⽰这是⼀个数据访问层bean
@Component:注解在类上,表⽰通⽤bean ,value不写默认就是类名⾸字母⼩写
@Autowired:按类型注⼊.默认属性required= true;当不能确定Spring 容器中⼀定拥有某个类的Bean 时,可以在需要⾃动注⼊该类Bean 的地⽅可以使⽤@Autowired(required = false),这等于告诉Spring:在不到匹配Bean时也不抛出BeanCreationException 异常。@Autowired 和 @Qualifier 结合使⽤时,⾃动注⼊的策略就从byType 转变byName 了。@Autowired可以对成员变量、⽅法以及构造函数进⾏注释,⽽@Qualifier 的标注对象是成员变量、⽅法⼊参、构造函数⼊参。正是由于注释对象的不同,所以 Spring 不将 @Autowired 和 @Qualifier 统⼀成⼀个注释类。
@Resource:按名称装配
区别:
@Resource默认按照名称⽅式进⾏bean匹配,@Autowired默认按照类型⽅式进⾏bean匹配
@Resource(importjavax.annotation.Resource;)是J2EE的注解,@Autowired(importorg.springframework.beans.factory.annotation.Autowired;)是Spring的注解
@Configuration:注解在类上,表⽰这是⼀个IOC容器,相当于spring的配置⽂件,java配置的⽅式。IOC容器的配置类⼀般与@Bean 注解配合使⽤,⽤@Configuration 注解类等价与 XML 中配置 beans,⽤@Bean 注解⽅法等价于 XML 中配置 bean。
@Bean:注解在⽅法上,声明当前⽅法返回⼀个Bean
@Scope:注解在类上,描述spring容器如何创建Bean实例。
(1)singleton:表⽰在spring容器中的单例,通过spring容器获得该bean时总是返回唯⼀的实例
(2)prototype:表⽰每次获得bean都会⽣成⼀个新的对象
(3)request:表⽰在⼀次http请求内有效(只适⽤于web应⽤)
(4)session:表⽰在⼀个⽤户会话内有效(只适⽤于web应⽤)
(5)globalSession:表⽰在全局会话内有效(只适⽤于web应⽤)
在多数情况,我们只会使⽤singleton和prototype两种scope,如果未指定scope属性,默认为singleton
@Value:注解在变量上,从配置⽂件中读取。
例如:@Value(value = “#{message}”)
@ConfigurationProperties 赋值,将注解转换成对象。给对象赋值。车险项⽬:HttpClientSetting类
@Profile:注解在⽅法类上在不同情况下选择实例化不同的Bean特定环境下⽣效
@SpringBootApplication:@SpringBootApplication=@ComponentScan+@Configuration+@EnableAutoConfiguration:约定优于配置
@EnableAutoConfiguration启⽤Spring 应⽤程序上下⽂的⾃动配置,试图猜测和配置您可能需要的bean。⾃动配置类通常采⽤基于你的classpath 和已经定义的beans 对象进⾏应⽤。被@EnableAutoC
onfiguration 注解的类所在的包有特定的意义,并且作为默认配置使⽤。通常推荐将@EnableAutoConfiguration 配置在root 包下,这样所有的⼦包、类都可以被查到。
@ComponentScan:注解在类上,扫描标注了@Controller等注解的类,注册为bean 。@ComponentScan 为@Configuration注解的类配置组件扫描指令。@ComponentScan 注解会⾃动扫描指定包下的全部标有@Component注解的类,并注册成bean,当然包括@Component下的⼦注解@Service、@Repository、@Controller。
@RestController @RestController 是⼀个结合了 @ResponseBody 和 @Controller 的注解
@Responsebody 注解表⽰该⽅法的返回的结果直接写⼊ HTTP 响应正⽂(ResponseBody)中,⼀般在异步获取数据时使⽤,通常是在使⽤ @RequestMapping 后,返回值通常解析为跳转路径,加上@Responsebody 后返回结果不会被解析为跳转路径,⽽是直接写⼊HTTP 响应正⽂中。
@RequestBody
@PathVariable
@RequestParam
两者的作⽤都是将request⾥的参数的值绑定到contorl⾥的⽅法参数⾥的,区别在于,URL写法不同。
当请求参数username不存在时会有异常发⽣,可以通过设置属性required=false解决,例如:
@RequestParam(value="username",required=false)
不写的时候也可以获取到参数值,但是必须名称对应。参数可以省略不写
@RequestMapping 和请求报⽂是做对应的
a:value,指定请求的地址
b:method 请求⽅法类型这个不写的话,⾃适应:get或者post
c:consumes 请求的提交内容类型
d:produces 指定返回的内容类型仅当request请求头中的(Accept)类型中包含该指定类型才返回
e: params 指定request中必须包含某些参数值
f:headers 指定request中必须包含指定的header值
g: name 指定映射的名称
@RequestMapping(method = RequestMethod.GET)
@RequestMapping(method = RequestMethod.POST)
@RequestMapping(method = RequestMethod.PUT)
@RequestMapping(method = RequestMethod.DELETE)
当然也可以使⽤
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping 这与上⾯的是⼀样的效果
@EnablCaching @EnableCaching注解是spring framework中的注解驱动的缓存管理功能。⾃spring版本3.1起加⼊了该注解。如果你使⽤了这个注解,那么你就不需要在XML⽂件中配置cache manager了。
@suppresswarnings 抑制警告
@Modifying 如果是增,改,删加上此注解
1:⽅法的返回值应该是int,表⽰更新语句所影响的⾏数。
2:在调⽤的地⽅必须加事务,没有事务不能正常执⾏。@Transactional 事务注解
@Query ⾃定义查询语句 JPQL
Spring Boot常⽤配置:
⼀、Spring Boot 启动注解说明
@SpringBootApplication开启了Spring的组件扫描和Spring Boot的⾃动配置功能。实际上, @SpringBootApplication将三个有⽤的注解组合在了⼀起。
Spring的@Configuration:标明该类使⽤Spring基于Java的配置。虽然本书不会写太多配置,但我们会更倾向于使⽤基于Java⽽不是XML的配置。
Spring的@ComponentScan:启⽤组件扫描,这样你写的Web控制器类和其他组件才能被⾃动发现并
注册为Spring应⽤程序上下⽂⾥的Bean。默认扫
描@SpringBootApplication所在类的同级⽬录以及它的⼦⽬录。本章稍后会写⼀个简单的Spring MVC控制器,使⽤@Controller进⾏注解,这样组件扫描才能到它。
Spring Boot 的 @EnableAutoConfiguration:这个不起眼的⼩注解也可以称为@Abracadabra①,就是这⼀⾏配置开启了Spring Boot⾃动配置的魔⼒,让你不⽤再写成篇的配置了。
在Spring Boot的早期版本中,你需要在ReadingListApplication类上同时标上这三个注解,但从Spring Boot 1.2.0开始,有@SpringBootApplication就⾏了。
⼆、Bean的scope
scope描述了spring容器如何新建bena的实例,spring的scope有以下⼏种,通过@Scope注解来实现
Singleton:⼀个spring容器中只有⼀个bena的实例,此为spring的默认配置,全容器共享⼀个实例的bean。
Prototype:每次调⽤新建⼀个bean的实例。
Request:web项⽬中,给每⼀个http request新建⼀个Bean实例。
Session :web项⽬中,给每⼀个http session新建⼀个实例。
GlobalSession:这个只在portal应⽤中有⽤,给每⼀个global http session新建⼀个bean实例。
另外,在spring batch中还有⼀个Scope是使⽤@StepScope,⽤在批处理中。
三、Bean的初始化和销毁
在我们实际开发的时候,经常会遇到在bean使⽤之前或者之后做⼀些必要的操作,spring 对bean的⽣命周期的操作提供了⽀持。在使⽤java配置和注解配置下提供如下两种⽅式:
java配置⽅式:使⽤@Bean的initMethod和destroyMethod(相当于xml配置的init-method和destory-method)
注解⽅式:利⽤JSR-250的@PostConstruct和@PreDestroy
四、Spring EL和资源调⽤
spring EL-Spring表达式语⾔,⽀持在xml和注解中使⽤表达式,类似于jsp的EL表达式语⾔。
spring开发中经常涉及调⽤各种资源的情况,包含普通⽂件,⽹址,配置⽂件,系统环境变量等,我
们可以使⽤ spring表达式语⾔实现资源的注⼊。 spring主要在注解@Vavle的参数中使⽤表达式。
下⾯演⽰⼀下⼏种情况:
注⼊普通字符串
注⼊操作系统属性
注⼊表达式运算结果
注⼊其他Bean的属性
注⼊⽂件内容
注⼊⽹址内容
注⼊属性⽂件
五、Profile
1、基础练习
Profile为在不同环境下使⽤不同的配置提供了⽀持(开发环境下的配置和⽣产环境下的配置不同,⽐如数据库)
通过设定Enviroment的ActiveProfiles来设定当前context需要使⽤的配置环境。在开发中使⽤@Profile注解类或者⽅法,达到在不同情况下选择实例化不同的Bean 通过设定jvm的spring.profiles.active参数来设置配置环境
Web项⽬设置在Servlet的context parameter中
1、定义⼀个bean
public class CustomProfileBean {spring ioc注解
private String content;
public CustomProfileBean(String content) {
super();
}
public String getContent() {
return content;
}
public void setContent(String content) {
}
}
2、配置
@Configuration
public class CustomProfileConfig {
@Bean
@Profile("dev")//Profile为dev时实例化devCustomProfileBean
public CustomProfileBean devCustomProfileBean(){
return new CustomProfileBean("from development pfofile");
}
@Bean
@Profile("prod")//Profile为prod时实例化prodCustomProfileBean
public CustomProfileBean prodCustomProfileBean(){
return new CustomProfileBean("from production profile");
}
}
3、启动运⾏
public class CustomProfileMain {
public static void main(String [] args){
//AnnotationConfigApplicationContext作为spring容器,接受⼀个配置类作为参数
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
//先将活动的Profile设置为prod
//后置注册Bean配置类,不然会报bean未定义的错误
//刷新容器
CustomProfileBean demoBean = Bean(CustomProfileBean.class);
System.out.Content());
context.close();
}
}
2、⽇志信息的配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true"><!-- debug="true"设置调试模式 -->
<!--定义⽇志⽂件的存储地址勿在 LogBack 的配置中使⽤相对路径,⽂件要以l命名-->
<springProfile name="test">
<property name="catalina.base" value="/home/webapp/logs/spring-boot"/>
</springProfile>
<springProfile name="prod">
<property name="catalina.base" value="/app/webapp/logs/spring-boot"/>
</springProfile>
<springProfile name="dev">
<property name="catalina.base" value="H:/logs/spring-boot"/>
</springProfile>
<!--<springProperty scope="context" name="catalina.base" source="catalina.base"/>-->
<!-- ⽇志地址 -->
<!--<property name="catalina.base" value="H:/logs"></property>-->
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.ConsoleAppender">
<encoder class="ch.qos.der.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} 耗时:%r ⽇志来⾃:%logger{50} ⽇志类型: %-5p ⽇志内容:%m%n</pattern> </encoder>
</appender>
<!-- 按照每天⽣成⽇志⽂件 -->
<appender name="DEFAULT-APPENDER" class="ch.olling.RollingFileAppender">
<File>${catalina.base}/logs/common-default.log</File>
<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">
<!--⽇志⽂件输出的⽂件名 -->
<FileNamePattern>${catalina.base}/logs/common-default-%d{yyyy-MM-dd}.log</FileNamePattern>
<!--⽇志⽂件保留天数 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.der.PatternLayoutEncoder">
<!--格式化输出:%d表⽰⽇期,%thread表⽰线程名,%-5level:级别从左显⽰5个字符宽度%msg:⽇志消息,%n是换⾏符 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--⽇志⽂件最⼤的⼤⼩ -->
<triggeringPolicy class="ch.olling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 按照每天⽣成⽇志⽂件 -->
<appender name="INFO-APPENDER" class="ch.olling.RollingFileAppender">
<File>${catalina.base}/logs/info-log.log</File>
<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">
<!--⽇志⽂件输出的⽂件名 -->
<FileNamePattern>${catalina.base}/logs/info-log-%d{yyyy-MM-dd}.log</FileNamePattern>
<!--⽇志⽂件保留天数 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
3、Java代码中根据系统环境处理逻辑创建⼀个服务,实现ApplicationContextAware接⼝
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论