spring的发展
- spring1.x
所有的配置都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java与xml配置文件中切换
- spring2.x
随着jdk1.5带来的注解支持,spring就可以使用注解bean进行申明和注入,大大减少了xml配置文件,同时也大大简化了项目的开发
最佳实践:
1.应用的基本配置用xml,比如:数据源、资源文件等
2.业务开发用注解,比如:service中注入bean等
- spring3.x到spring4.x
从spring3.x开始提供了java配置方式,使用java配置方式可以更好的理解你配置的bean,现在我们就处于这个时代,并且spring4.x和springBoot都推荐使用Java配置
spring的Java配置方式
Java配置是spring4.x推荐使用配置方式,完全替代xml配置
- @Configuration和@Bean
- @Configuration 作用于类上 ---- 相当于一个xml文件
- @Bean 作用于方法上 ---- 相当与一个bean标签
- 示例
使用示例演示了通过Java配置方式进行配置spring,并且实现springIOC功能
- 创建工程以及导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
- 编写User对象
public class User {
private String username;
private String password;
private Integer age;
}
- 编写UserDao用于模板与数据库的交互
public class UserDAO {
public List<User> queryUserList(){
List<User> result = new ArrayList<User>();
// 模拟数据库的查询
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUsername("username_" + i);
user.setPassword("password_" + i);
user.setAge(i + 1);
result.add(user);
}
return result;
}
}
- 编写UserService 用于实现User数据操作业务逻辑
@Service
public class UserService {
@Autowired // 注入Spring容器中的bean对象
private UserDAO userDAO;
public List<User> queryUserList() {
// 调用userDAO中的方法进行查询
return this.userDAO.queryUserList();
}
}
- 编写SpringConfig 用于实例化Spring容器
@Configuration //通过该注解来表明该类是一个Spring的配置,相当于一个xml文件
@ComponentScan(basePackages = "cn.itcast.springboot.javaconfig") //配置扫描包
public class SpringConfig {
@Bean // 通过该注解来表明是一个Bean对象,相当于xml中的<bean>
public UserDAO getUserDAO(){
return new UserDAO(); // 直接new对象做演示
}
}
- 编写测试方法,用于启动spring容器
public class Main {
public static void main(String[] args) {
// 通过Java配置来实例化Spring容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
// 在Spring容器中获取Bean对象
UserService userService = context.getBean(UserService.class);
// 调用对象中的方法
List<User> list = userService.queryUserList();
for (User user : list) {
System.out.println(user.getUsername() + ", " + user.getPassword() + ", " + user.getPassword());
}
// 销毁该容器
context.destroy();
}
}
读取外部资源配置文件
通过@PropertySource可以指定读取的配置文件,通过@Value注解获取值,具体用法:
@Configuration //通过该注解来表明该类是一个Spring的配置,相当于一个xml文件
@ComponentScan(basePackages = "cn.itcast.springboot.javaconfig") //配置扫描包
@PropertySource(value= {"classpath:jdbc.properties"})
public class SpringConfig {
@Value("${jdbc.url}")
private String jdbcUrl;
@Bean // 通过该注解来表明是一个Bean对象,相当于xml中的<bean>
public UserDAO getUserDAO(){
return new UserDAO(); // 直接new对象做演示
}
}
-
如何配置多个配置文件
-
如果配置的配置文件不存在怎么办
配置数据库连接池
- 导入依赖
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
- 之前的xml配置
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 配置连接池属性 -->
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- c3p0连接池的私有属性 -->
<property name="maxPoolSize" value="30" />
<property name="minPoolSize" value="10" />
<!-- 关闭连接后不自动commit -->
<property name="autoCommitOnClose" value="false" />
<!-- 获取连接超时时间 -->
<property name="checkoutTimeout" value="10000" />
<!-- 当获取连接失败重试次数 -->
<property name="acquireRetryAttempts" value="2" />
</bean>
- 参考xml配置改造成java配置方式
@Value("${jdbc.url}")
private String jdbcUrl;
@Value("${jdbc.driverClassName}")
private String jdbcDriverClassName;
@Value("${jdbc.username}")
private String jdbcUsername;
@Value("${jdbc.password}")
private String jdbcPassword;
@Bean(destroyMethod = "close")
public DataSource dataSource() {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
// 数据库驱动
comboPooledDataSource.setDriverClass(jdbcDriverClassName);
// 相应驱动的jdbcUrl
comboPooledDataSource.setJdbcUrl(jdbcUrl);
// 数据库的用户名
comboPooledDataSource.setUsername(jdbcUsername);
// 数据库的密码
comboPooledDataSource.setPassword(jdbcUsername);
// 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0
comboPooledDataSource.setIdleConnectionTestPeriodInMinutes(60);
// 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0
comboPooledDataSource.setIdleMaxAgeInMinutes(30);
// 每个分区最大的连接数
comboPooledDataSource.setMaxConnectionsPerPartition(100);
// 每个分区最小的连接数
comboPooledDataSource.setMinConnectionsPerPartition(5);
return comboPooledDataSource;
}
使用idea创建一个springBoot项目
springBoot和spring MVC的关系:
springBoot是MVC的升级版,没有必要的联系
- 微服务
spring cloud,基于springBoot
删除红色框内的内容,非必须删除内容,只是没有用到的内容
- springBoot的属性配置
配置位置在
src->main->resources->新建application.properties/application.yml
application.properties
==application.yml
application.properties
书写起来较application.yml
麻烦
server.port=8081(启动端口) / server:
server.context-path=/exercise(启动时的地址) / port: 8081
context-path: /exercise
application.yml
server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dbgirl
username: root
password: root
jpa:
hibernate:
ddl-auto: create
show-sql: true
- 在配置文件中可以自定义要显示的值
例如:
在yml文件中,书写
server:
port: 8081
cupSize: B
age: 20
context: "cupSize: ${cupSize},age: ${age}"
在自定义的文件中即可写:
@Value("${cupSize}")
private 修饰符(String/Integer) cupSize;
- 部分注解
- 获取前缀
@ConfigurationProperties(prefix="前缀名")
@Component 开启配置
- Controller的使用
@Controller 处理HTTP请求
@RestController spring4之后的新加注解,原来返回json需要@ResponseBody配合@Controller
@RequestMapping 配置url映射
@PathVariable 获取url中的数据
@RequestParam 获取请求参数的值
@GetMapping 组合注解
- 事务
@Transactional