springboot(使用)
springboot(使用)
springboot的自动配置是引入了started jar之后就自动集成了相应的框架,不做额外的代码覆盖的话就用这个框架的默认的配置,自动装配的框架都会
有默认配置(@EnableAutoConfiguration)(装配好配置好的文件类,默认的文件类)
修改之后需要对build.gradle右键刷新才可
@Configuration 配置类
@Import导入类
@ComponentScan收集spring所有spring类包括@Configuration 搜索beans,并结合 @Autowired 构造器注入。
如果将主应用类放到根目录下,@componentScan不需要任何参数,即可搜集到所有( @Component , @Service , @Repository , @Controller 等)
@ImportResource 加载xml
@PropertySource 加载properties文件 等同于 <context:property-placeholder location="classpath:jdbc.properties" />
@ConfigurationProperties 将配置转化成Java实体
EnableAutoConfiguration自动配置或 @SpringBootApplication添加到一个 @Configuration 类上来选择自动配置。
根据加载的jar依赖自动配置,而且自动配置@Configuration的类
@SpringBootApplication=@Configuration , @EnableAutoConfiguration 和 @ComponentScan
--debug启动可以看当前的自动配置
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})禁用自定义配置,排除相应主类即可(引入jar之后自动引入autoconfig,默认配置集成,不需要的话就exclude)
java -jar 运行jar
java -jar target/myproject-0.0.1-SNAPSHOT.jar
可以设置远程运行的jar包(开启远程调试),在本机调试
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
-jar target/myproject-0.0.1-SNAPSHOT.jar
CommandLineRunne 命令行启动是指定在应用启动之后马上执行的代码(如果有多个可以设置执行顺序)实现这个接口即可
外化配置:
即参数的引用
使用@Value注解,可以直接将属性值注入到你的beans中 不必自己配置这个工具类springboot自己配置,单纯使用spring的话需要陪置
覆盖顺序:
Spring Boot使用一个非常特别的PropertySource次序来允许对值进行合理的覆盖,需要以下面的次序考虑属性:(越在上优先级越大)
1. 命令行参数
2. 来自于java:comp/env的JNDI属性
3. Java系统属性(System.getProperties())
4. 操作系统环境变量
5. 只有在random.*里包含的属性会产生一个RandomValuePropertySource
6. 在打包的jar外的应用程序配置文件(application.properties,包含YAML和profile变量)
7. 在打包的jar内的应用程序配置文件(application.properties,包含YAML和profile变量)
8. 在@Configuration类上的@PropertySource注解
9. 默认属性(使用SpringApplication.setDefaultProperties指定)
import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*
@Component
public class MyBean {
@Value("${name}")
private String name;
// ...
}
注入随机值:
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
可以通过命令行将参数放到spring环境中,也可以通过application.properties文件将配置放到spring环境中
属性文件可以配置多个,同名或不同名,在不同的路径优先级不同
1. 当前目录下的一个/config子目录
2. 当前目录
3. 一个classpath下的/config包
4. classpath根路径(root)
这个列表是按优先级排序的(列表中位置高的将覆盖位置低的)。
本配置文件可以用本配置文件的值(${})
自动装配的个性化覆盖,排除
覆盖,
1·重新注入相同的类(因为springboot在默认配置的时候用用的id就是根据类名来的,当我们用同样的类那么名字就自然一样,这样就覆盖了默认配置)
如果不想覆盖执行器的访问规则,你可以使用
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)注解该bean,否则使用
@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)注解该bean。
Spring MVC使用HttpMessageConverter接口转换HTTP请求和响应。合理的缺省值被包含的恰到好处(out of the box),例
如对象可以自动转换为JSON(使用Jackson库)或XML(如果Jackson XML扩展可用则使用它,否则使用JAXB)。字符串
默认使用UTF-8编码。
如果需要添加或自定义转换器,你可以使用Spring Boot的HttpMessageConverters类:
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.*;
@Configuration
public class MyConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> additional = ...
HttpMessageConverter<?> another = ...
return new HttpMessageConverters(additional, another);
}
}
任何在上下文中出现的HttpMessageConverter bean将会添加到converters列表,你可以通过这种方式覆盖默认的转换器
(converters)。
26.1.2.
2,
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})禁用自定义配置,排除相应主类即可
静态内容:
webappz整个标准只会在打成war时起作用,如果要打成jar包这个是不起作用的,springboot会从classpath下的/static(/public,/resources或/META-INF/resources)的文件
或servletcontext根目录提供静态内容
当你使用这些引擎的任何一种,并采用默认的配置,你的模板将会从src/main/resources/templates目录下自动加载。
目前的打成的jar包不含有webapp下的静态文件,怎么弄?????????????????????????????????????
3,@EnableWebSecurity通过标签关闭默认的配置;重新配置新的配置
@EnableWebSecurity bean来彻底关掉Spring Boot的默认配置。为了对它进行自定义,你需要使用
外部的属性配置和WebSecurityConfigurerAdapter类型的beans(比如,添加基于表单的登陆)
静态注入配置文件到bean的属性:
1,@Value
2,@ConfigurationProperties(prefix="connection") 所有前缀是connection都放在bean的同名属性中
@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {
private String username;
private InetAddress remoteAddress;
// ... getters and setters
}
在其他类引用:
@Autowired
private ConnectionSettings connection;
通过@EnableConfigurationProperties注入
@Configuration
@EnableConfigurationProperties(ConnectionSettings.class)
public class MyConfiguration {
}
可以设置内嵌的servlet容器,不同容器对jsp的支持受限
Spring Data提供一个额外的功能,直接从接口创建Repository实现,
spring data jpa 是生成实体
传统上,JPA实体类被定义到一个persistence.xml文件中。在Spring Boot中,这个文件不是必需的,并被'实体扫描'替代。默
认情况下,在你主(main)配置类(被@EnableAutoConfiguration或@SpringBootApplication注解的类)下的所有包都将被
查找。(@EnableAutoConfiguration扫描主类所在包及所有子包)
配置文件的使用:
把配置文件中的属性值映射到bean中
1,通过前缀,和bean中对应名称的属性利用get,set自动将配置文件中的同名属性注入,后面直接通过get,set获取(类型安全的配置属性)可以松散的绑定
@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {
private String username;
private InetAddress remoteAddress;
// ... getters and setters
}
# application.yml
connection:
username: admin
remoteAddress: 192.168.1.1
# additional configuration as required
松散的绑定
@Component
@ConfigurationProperties(prefix="person")
public class ConnectionSettings {
private String firstName;
}
person.firstName 标准驼峰规则
person.first-name 虚线表示,推荐用于.properties和.yml文件中
PERSON_FIRST_NAME 大写形式,使用系统环境变量时推荐
2,直接指定一个属性文件源,bean不需要属性名,后续通过操作这个bean来操作属性文件 (第三方配置)
@Configuration
@ConfigurationProperties
@PropertySource("classpath:paprocesser.properties") //只适用.properties,yml不行
public class ProcesserProperty extends Properties{
}
//或
@ConfigurationProperties(prefix = "foo")
@Bean
public FooComponent fooComponent() {
...
}
paprocesser.propertie
1310=inMoneyProcesser
//获取
String processerBeanName = processerProperty.getProperty("1310");
3,直接用@Value("${pa.url}")拿
@Value("${pa.url}")
private String paUrl ;
自动装配也就意味者会实例化自动配置中需要的bean
这些bean在用的时候可以通过set注入,也可以通过构造方法注入
你可以注入一个自动配置的 org.springframework.data.mongodb.MongoDbFactory 来访问Mongo数据库。
public class MyBean {
private final MongoDbFactory mongo;
@Autowired//构造方法注入
public MyBean(MongoDbFactory mongo) {
this.mongo = mongo;
}
自动装配的触发:
如果发现ActiveMQ在classpath下可用,Spring Boot会配置一个ConnectionFactory。如果需要代理,将会开启一个内嵌的,
已经自动配置好的代理(只要配置中没有指定代理URL)。
jmx相当于jconsle
在spring需要哪些bean被监控管理,只需要在此类上加注解即可,框架扫面到这些注解即会自动导出被监控的bean(springboot只要导入了jmx的包即集成好了jmx直接用即可)
,普通的spring中需要配置下jmx @ManagedResource,@ManagedAttribute,@ManagedOperation)
测试:
使用注解的测试类(依赖注入,可以直接使用spring容器中的bean,否则拿不到上下文)
1,通过application运行的
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SampleDataJpaApplication.class)
public class CityRepositoryIntegrationTests {
@Autowired
CityRepository repository;
// ...
}
2,以web方式运行的,通过http请求验证的(在一的基础上加@WebIntegrationTest即可)
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SampleDataJpaApplication.class)
@WebIntegrationTest
public class CityRepositoryIntegrationTests {
@Autowired
CityRepository repository;
RestTemplate restTemplate = new TestRestTemplate();
// ... interact with the running server
}
server.context-path=/settlement
RestTemplate其实就是一个封装了原始的httpclient等基于地址的请求客户端
新的模块的引入:(一个包)
1,**config.java//相当于框架的配置文件,准备配置类
@Configuration
public class PaConfig {
@Bean
public RestTemplate restTemplate(){
RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
RestTemplate paTemplate = restTemplateBuilder.build();
paTemplate.getMessageConverters().clear();
paTemplate.getMessageConverters().add(new PaHttpMessageConverter());
return paTemplate;
}
}
2,准备1中需要配置的类
3,使用类
thymeleaf模版
除了一般的springmvc自己的视图解析器功能,还有动静自动切换的功能
http://www.open-open.com/lib/view/open1451625468230.html
模版封装后使用思想:
<!-- Scans the classpath of this application for @Components to deploy as beans -->
<context:component-scan base-package="com.test.thymeleaf.controller" />
<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />
<!--Resolves view names to protected .jsp resources within the /WEB-INF/views directory -->
<!--springMVC+jsp的跳转页面配置-->
<!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">-->
<!--<property name="prefix" value="/WEB-INF/views/" />-->
<!--<property name="suffix" value=".jsp" />-->
<!--</bean>-->
<!--springMVC+thymeleaf的跳转页面配置-->
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".html" />
<property name="templateMode" value="HTML5" />
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver" />
</bean>
<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">//////spring提供自动封装的类thymeleaf-spring4-2.1.4.RELEASE.jar
<property name="templateEngine" ref="templateEngine" />
</bean>
thymeleaf-2.1.4.RELEASE.jar整个模版框架
thymeleaf-spring4-2.1.4.RELEASE.jar//spring提供自动封装的类
//一份静态的属性一份动态的属性
<img src="../../static/assets/images/qr-code.jpg" th:src="@{${path}}" alt="二维码" />
<p th:utext="#{home.welcome}">Welcome to our grocery store!</p>
<input type="text" name="userName" value="James Carrot" th:value="${user.name}" />
--简单数据转换(数字,日期)
<dt>价格</dt>
<dd th:text="${#numbers.formatDecimal(product.price, 1, 2)}">180</dd>
<dt>进货日期</dt>
<dd th:text="${#dates.format(product.availableFrom, 'yyyy-MM-dd')}">2014-12-01</dd>
--字符串拼接
<dd th:text="${'$'+product.price}">235</dd>