1.Spring的发展史
1.1Spring1.X时代
都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。
1.2Spring2.X时代
随着JDK1.5带来的注解支持,spring2.X可以使用注解对bean进行申明和注入,大大减少了xml配置文件,同时也大大简化了项目的开发。
那么问题来了,究竟是应该使用xml还是注解呢?
最佳实践:
1.应用的基本配置用xml,比如:数据源、资源文件等等;
2.业务开发用注解,比如:service中注入bean等等
1.3Spring3.X到spring4.X
从spring3.X开始提供了java配置方式,使用java配置方式可以更高的理解你配置的bean,现在我们就处于这个时代,并且spring4.x和springboot都推荐使用java配置的方式
2.spring的java配置方式
2.1.@Configuration和@Bean
spring的java配置方式是通过@Configuration和@Bean这两个注解实现的:
- @Configuration作用于类上,相当于一个xml配置文件;
- @Bean作用于方法上,相当于xml配置中的<bean>;
- spring boot基于springmvc的基础上进行了改进,将@controller与@ResponseBody进行了合并成一个新的注解@RestController
2.2示例,该示例演示了通过java配置的方式进行配置spring,并实现了springIOC功能。
2.21创建工程以及依赖架包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>dbcp</artifactId>
<version>6.0.29</version>
</dependency>
2.22编写user对象
public class User {
private String username;
private String password;
private Integer age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
2.23编写UserDao用于模拟与数据库的交互
public class UserDao {
public List<User> findAll(){
List<User> list = 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);
list.add(user);
}
return list;
}
}
2.24编写userService用于实现user数据操作业务逻辑
@Service
public class UserService {
@Autowired
private UserDao userDao;
public List<User> findAll(){
List<User> list = userDao.findAll();
return list;
}
}
2.25编写springConfig用于实例化spring容器
@Configuration//通过该注解来表明该类是一个Spring的配置,相当于一个xml文件
@ComponentScan(basePackages="com.zhiyou100.service")
public class SpringConfig {
@Bean //通过该注解来表明一个Bean对象,相当于xml中的<bean>
public UserDao getUserDao() {
return new UserDao();//直接new对象做演示
}
}
2.26编写测试方法用于启动spring容器
//编写测试方法 用于启动Spring容器
public class Main {
public static void main(String[] args) {
//通过java配置来实例化spring容器
AnnotationConfigApplicationContext acac =
new AnnotationConfigApplicationContext(SpringConfig.class);
//在spring容器中获取对象
UserService service = acac.getBean(UserService.class);
//调用对象的方法
List<User> list = service.findAll();
for (User user : list) {
System.out.println(user.getUsername()+","+user.getPassword());
}
//销毁容器
acac.destroy();
}
}
2.27测试效果
从以上的示例中可以看出,使用java代码可以完美的代替xml配置文件,并且结构更加的清晰。
3.1读取外部的资源配置文件
通过@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对象做演示
}
}
思考:
- 如何配置多个配置文件?
@ComponentScan(basePackages="com.zhiyou100.service")
@PropertySource(value= {"classpath:jdbc.properties","XXXX"},ignoreResourceNotFound = true)
public class SpringConfig {}
- 如果配置的配置文件不存在会怎么样?
@ComponentScan(basePackages="com.zhiyou100.service")
@PropertySource(value= {"classpath:jdbc.properties","XXXX"},ignoreResourceNotFound = true)
public class SpringConfig {}
3.2配置数据库连接池
@Value("${url}")
private String url;
@Value("${driverClass}")
private String driverClassName;
@Value("${user}")
private String user;
@Value("${password}")
private String password;
@Bean
public DataSource dataSource() {
BasicDataSource bds = new BasicDataSource();
//数据驱动
bds.setDriverClassName(driverClassName);
//相应数据库驱动jdbcurl
bds.setUrl(url);
//数据库的用户名
bds.setUsername(user);
//数据库的密码
bds.setPassword(password);
return bds;
}
4.springboot
4.1什么是springboot
是使用springboot很容易创建一个独立的运行(运行jar,内嵌servlet容器)、准生产级别的基于spring框架的项目,使用springboot可以不用或者只需要很少的spring配置
4.2springboot的优缺点
优点:
- 快速构建项目
- 对主流开发的无配置集成
- 项目可独立运行,无须外部依赖servlet容器;
- 提供运行时的应用监控;
- 极大地提高了开发、部署效率
- 与云就是那的天然继承
缺点:
- 书籍文档较少且不够深入
4.3设置spring boot 的parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
导入spring boot的web支持
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
添加springboot的插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
编写一个spring boot的应用
@Controller
@SpringBootApplication
@Configuration
public class HelloApplication {
@RequestMapping("hello")
@ResponseBody
public String hello(){
return "hello world!";
}
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
代码说明:
- 1、@SpringBootApplication:Spring Boot项目的核心注解,主要目的是开启自动配置。;
- 2、@Configuration:这是一个配置Spring的配置类;
- 3、@Controller:标明这是一个SpringMVC的Controller控制器;
- 4、main方法:在main方法中启动一个应用,即:这个应用的入口;
4.4springboot的核心
Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法。
@SpringBootApplication注解是Spring Boot的核心注解,它其实是一个组合注解:
该注解主要组合了以下注解:
@SpringBootConfiguration:这是Spring Boot项目的配置注解,这也是一个组合注解:
在Spring Boot项目中推荐使用@ SpringBootConfiguration替代@Configuration
@EnableAutoConfiguration:启用自动配置,该注解会使Spring Boot根据项目中依赖的jar包自动配置项目的配置项:
如:我们添加了spring-boot-starter-web的依赖,项目中也就会引入SpringMVC的依赖,Spring Boot就会自动配置tomcat和SpringMVC
@ComponentScan:默认扫描@SpringBootApplication所在类的同级目录以及它的子目录。
4.5xml配置文件
springboot提倡零配置,即无xml配置,但是在实际项目中。可能有一些特殊要求你必须使用xml配置,这是我们可以用个spring提供的@ImportResource来加载xml配置。
@ImportResource({"classpath:some-context.xml","classpath:another-context.xml"})
5.spring boot 的web开发 Web开发的自动配置类:org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration
<!-- 1.servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- 2.jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- 3.jsp支持 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
然后正常编程即可,重定向也可以。页面传值,中文乱码都可以
自动配置静态资源,可以直接访问
自定义springmvc的配置
有些时候我们需要自已配置SpringMVC而不是采用默认,比如说增加一个拦截器,这个时候就得通过继承WebMvcConfigurerAdapter然后重写父类中的方法进行扩展。
第一步创建一个类实现HandlerInterceptor接口,重写接口的方法,只是多了一个@Component注解,这个注解是为后面的使用时进行注入
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器开始拦截");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器时");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器之后");
}
}
第二步在入口类的目录或者兄弟目录下创建一个类继承WebMvcConfigurerAdapter类并重写addInterceptors方法;
@SpringBootConfiguration注解表明这是一个配置类
@SpringBootConfiguration
public class InterceptorConfig extends WebMvcConfigurationSupport {
@Autowired
MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
System.out.println("拦截器启动");
super.addInterceptors(registry);
}
}
若目录不是兄弟或子目录可以不用注入用new即可
设置事务管理
在Spring Boot中推荐使用@Transactional注解来申明事务。
首先需要导入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
当引入jdbc依赖之后,Spring Boot会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager,所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用。