标签:依赖 common 介绍 并且 nat 控制 java框架 驱动程序 hello
Spring是一个非常流行的基于Java的框架,用于构建Web和企业应用程序。与许多其他框架仅关注一个领域不同,Spring框架通过其投资组合项目提供了广泛的功能来满足现代业务需求。
Spring框架提供了以多种方式(例如XML,Annotations和JavaConfig)配置bean的灵活性。随着功能数量的增加,复杂性也随之增加,配置Spring应用程序变得乏味且容易出错。
Spring团队创建了Spring Boot来解决配置的复杂性。
但是在深入探讨SpringBoot之前,我们将快速浏览一下Spring框架,看看SpringBoot试图解决什么样的问题。
在本文中,我们将介绍:
如果你是Java开发人员,那么你很有可能听说过Spring框架,并且很可能已在项目中使用了它。Spring框架主要是作为依赖关系注入容器创建的,但不仅如此。
Spring非常受欢迎有几个原因:
除Spring框架外,还有许多其他Spring姐妹项目可帮助构建满足现代业务需求的应用程序:
还有许多其他有趣的项目可以满足其他各种现代应用程序开发需求。
最初,Spring框架提供了一种用于配置bean的基于XML的方法。后来,Spring引入了用于配置bean的基于XML的DSL,注释和基于JavaConfig的方法。
让我们快速看一下每种配置样式的外观。
1 <bean id="userService" class="com.sivalabs.myapp.service.UserService"> 2 <property name="userDao" ref="userDao"/> 3 </bean> 4 <bean id="userDao" class="com.sivalabs.myapp.dao.JdbcUserDao"> 5 <property name="dataSource" ref="dataSource"/> 6 </bean> 7 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 8 <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 9 <property name="url" value="jdbc:mysql://localhost:3306/test"/> 10 <property name="username" value="root"/> 11 <property name="password" value="secret"/> 12 </bean>
1 @Service 2 public class UserService 3 { 4 private UserDao userDao; 5 @Autowired 6 public UserService(UserDao dao){ 7 this.userDao = dao; 8 } 9 ... 10 ... 11 } 12 @Repository 13 public class JdbcUserDao 14 { 15 private DataSource dataSource; 16 @Autowired 17 public JdbcUserDao(DataSource dataSource){ 18 this.dataSource = dataSource; 19 } 20 ... 21 ... 22 }
1 @Configuration 2 public class AppConfig 3 { 4 @Bean 5 public UserService userService(UserDao dao){ 6 return new UserService(dao); 7 } 8 @Bean 9 public UserDao userDao(DataSource dataSource){ 10 return new JdbcUserDao(dataSource); 11 } 12 @Bean 13 public DataSource dataSource(){ 14 BasicDataSource dataSource = new BasicDataSource(); 15 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 16 dataSource.setUrl("jdbc:mysql://localhost:3306/test"); 17 dataSource.setUsername("root"); 18 dataSource.setPassword("secret"); 19 return dataSource; 20 } 21 }
哇... Spring提供了许多用于完成同一任务的方法,我们甚至可以混合使用这些方法,并在同一应用程序中同时使用基于JavaConfig和基于注释的配置样式。
这具有很大的灵活性,既有好处也有坏处。 刚接触Spring框架的人可能会对采用哪种方法感到困惑。 到目前为止,Spring团队建议遵循基于JavaConfig的方法,因为它可以提供更大的灵活性。
但是,没有一种千篇一律的解决方案。 必须根据自己的应用程序需求选择方法。
好的,现在你已经大致了解了各种样式的Spring bean配置外观。
让我们快速看一下典型的SpringMVC + JPA / Hibernate Web应用程序配置的配置。
在了解什么是Spring Boot及其提供的功能之前,让我们看一下典型的Spring Web应用程序配置的外观,痛点以及Spring Boot如何解决这些问题。
我们需要做的第一件事是配置pom.xml中所需的所有依赖项。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 5 http://maven.apache.org/maven-v4_0_0.xsd"> 6 <modelVersion>4.0.0</modelVersion> 7 <groupId>com.sivalabs</groupId> 8 <artifactId>springmvc-jpa-demo</artifactId> 9 <packaging>war</packaging> 10 <version>1.0-SNAPSHOT</version> 11 <name>springmvc-jpa-demo</name> 12 <properties> 13 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 14 <maven.compiler.source>1.8</maven.compiler.source> 15 <maven.compiler.target>1.8</maven.compiler.target> 16 <failOnMissingWebXml>false</failOnMissingWebXml> 17 </properties> 18 <dependencies> 19 <dependency> 20 <groupId>org.springframework</groupId> 21 <artifactId>spring-webmvc</artifactId> 22 <version>4.2.4.RELEASE</version> 23 </dependency> 24 <dependency> 25 <groupId>org.springframework.data</groupId> 26 <artifactId>spring-data-jpa</artifactId> 27 <version>1.9.2.RELEASE</version> 28 </dependency> 29 <dependency> 30 <groupId>org.slf4j</groupId> 31 <artifactId>jcl-over-slf4j</artifactId> 32 <version>1.7.13</version> 33 </dependency> 34 <dependency> 35 <groupId>org.slf4j</groupId> 36 <artifactId>slf4j-api</artifactId> 37 <version>1.7.13</version> 38 </dependency> 39 <dependency> 40 <groupId>org.slf4j</groupId> 41 <artifactId>slf4j-log4j12</artifactId> 42 <version>1.7.13</version> 43 </dependency> 44 <dependency> 45 <groupId>log4j</groupId> 46 <artifactId>log4j</artifactId> 47 <version>1.2.17</version> 48 </dependency> 49 <dependency> 50 <groupId>com.h2database</groupId> 51 <artifactId>h2</artifactId> 52 <version>1.4.190</version> 53 </dependency> 54 <dependency> 55 <groupId>commons-dbcp</groupId> 56 <artifactId>commons-dbcp</artifactId> 57 <version>1.4</version> 58 </dependency> 59 <dependency> 60 <groupId>mysql</groupId> 61 <artifactId>mysql-connector-java</artifactId> 62 <version>5.1.38</version> 63 </dependency> 64 <dependency> 65 <groupId>org.hibernate</groupId> 66 <artifactId>hibernate-entitymanager</artifactId> 67 <version>4.3.11.Final</version> 68 </dependency> 69 <dependency> 70 <groupId>javax.servlet</groupId> 71 <artifactId>javax.servlet-api</artifactId> 72 <version>3.1.0</version> 73 <scope>provided</scope> 74 </dependency> 75 <dependency> 76 <groupId>org.thymeleaf</groupId> 77 <artifactId>thymeleaf-spring4</artifactId> 78 <version>2.1.4.RELEASE</version> 79 </dependency> 80 </dependencies> 81 </project>
我们已经将所有Maven jar依赖项配置为包括Spring MVC,Spring Data JPA,JPA / Hibernate,Thymeleaf和Log4j。
1 @Configuration 2 @EnableTransactionManagement 3 @EnableJpaRepositories(basePackages="com.sivalabs.demo") 4 @PropertySource(value = { "classpath:application.properties" }) 5 public class AppConfig 6 { 7 @Autowired 8 private Environment env; 9 @Bean 10 public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() 11 { 12 return new PropertySourcesPlaceholderConfigurer(); 13 } 14 @Value("${init-db:false}") 15 private String initDatabase; 16 @Bean 17 public PlatformTransactionManager transactionManager() 18 { 19 EntityManagerFactory factory = entityManagerFactory().getObject(); 20 return new JpaTransactionManager(factory); 21 } 22 @Bean 23 public LocalContainerEntityManagerFactoryBean entityManagerFactory() 24 { 25 LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 26 HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 27 vendorAdapter.setGenerateDdl(Boolean.TRUE); 28 vendorAdapter.setShowSql(Boolean.TRUE); 29 factory.setDataSource(dataSource()); 30 factory.setJpaVendorAdapter(vendorAdapter); 31 factory.setPackagesToScan("com.sivalabs.demo"); 32 Properties jpaProperties = new Properties(); 33 jpaProperties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); 34 factory.setJpaProperties(jpaProperties); 35 factory.afterPropertiesSet(); 36 factory.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver()); 37 return factory; 38 } 39 @Bean 40 public HibernateExceptionTranslator hibernateExceptionTranslator() 41 { 42 return new HibernateExceptionTranslator(); 43 } 44 @Bean 45 public DataSource dataSource() 46 { 47 BasicDataSource dataSource = new BasicDataSource(); 48 dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); 49 dataSource.setUrl(env.getProperty("jdbc.url")); 50 dataSource.setUsername(env.getProperty("jdbc.username")); 51 dataSource.setPassword(env.getProperty("jdbc.password")); 52 return dataSource; 53 } 54 @Bean 55 public DataSourceInitializer dataSourceInitializer(DataSource dataSource) 56 { 57 DataSourceInitializer dataSourceInitializer = new DataSourceInitializer(); 58 dataSourceInitializer.setDataSource(dataSource); 59 ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); 60 databasePopulator.addScript(new ClassPathResource("data.sql")); 61 dataSourceInitializer.setDatabasePopulator(databasePopulator); 62 dataSourceInitializer.setEnabled(Boolean.parseBoolean(initDatabase)); 63 return dataSourceInitializer; 64 } 65 }
在我们的AppConfig.java配置类中,我们执行了以下操作:
我们需要在application.properties中配置属性占位符值,如下所示:
1 jdbc.driverClassName=com.mysql.jdbc.Driver 2 jdbc.url=jdbc:mysql://localhost:3306/test 3 jdbc.username=root 4 jdbc.password=admin 5 init-db=true 6 hibernate.dialect=org.hibernate.dialect.MySQLDialect 7 hibernate.show_sql=true 8 hibernate.hbm2ddl.auto=update
我们可以创建一个简单的SQL脚本data.sql,以将示例数据填充到USER表中:
1 delete from user; 2 insert into user(id, name) values(1,‘Siva‘); 3 insert into user(id, name) values(2,‘Prasad‘); 4 insert into user(id, name) values(3,‘Reddy‘);
我们可以使用以下基本配置创建log4j.properties文件:
1 log4j.rootCategory=INFO, stdout 2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 3 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 4 log4j.appender.stdout.layout.ConversionPattern=%5p %t %c{2}:%L - %m%n 5 log4j.category.org.springframework=INFO 6 log4j.category.com.sivalabs=DEBUG
我们将必须为i18n配置Thymeleaf ViewResolver,静态ResourceHandlers,MessageSource等。
1 @Configuration 2 @ComponentScan(basePackages = { "com.sivalabs.demo"}) 3 @EnableWebMvc 4 public class WebMvcConfig extends WebMvcConfigurerAdapter 5 { 6 @Bean 7 public TemplateResolver templateResolver() { 8 TemplateResolver templateResolver = new ServletContextTemplateResolver(); 9 templateResolver.setPrefix("/WEB-INF/views/"); 10 templateResolver.setSuffix(".html"); 11 templateResolver.setTemplateMode("HTML5"); 12 templateResolver.setCacheable(false); 13 return templateResolver; 14 } 15 @Bean 16 public SpringTemplateEngine templateEngine() { 17 SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 18 templateEngine.setTemplateResolver(templateResolver()); 19 return templateEngine; 20 } 21 @Bean 22 public ThymeleafViewResolver viewResolver() { 23 ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver(); 24 thymeleafViewResolver.setTemplateEngine(templateEngine()); 25 thymeleafViewResolver.setCharacterEncoding("UTF-8"); 26 return thymeleafViewResolver; 27 } 28 @Override 29 public void addResourceHandlers(ResourceHandlerRegistry registry) 30 { 31 registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 32 } 33 @Override 34 public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) 35 { 36 configurer.enable(); 37 } 38 @Bean(name = "messageSource") 39 public MessageSource configureMessageSource() 40 { 41 ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); 42 messageSource.setBasename("classpath:messages"); 43 messageSource.setCacheSeconds(5); 44 messageSource.setDefaultEncoding("UTF-8"); 45 return messageSource; 46 } 47 }
在我们的WebMvcConfig.java配置类中,我们执行了以下操作:
目前,我们没有任何消息要配置,因此请在src/main/ resources文件夹中创建一个空的messages.properties文件。
在Servlet 3.x规范之前,我们必须在web.xml中注册Servlet/过滤器。从Servlet 3.x规范开始,我们可以使用ServletContainerInitializer以编程方式注册Servlet/过滤器。
Spring MVC提供了一个方便的类AbstractAnnotationConfigDispatcherServletInitializer来注册DispatcherServlet。
1 public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer 2 { 3 @Override 4 protected Class<?>[] getRootConfigClasses() 5 { 6 return new Class<?>[] { AppConfig.class}; 7 } 8 @Override 9 protected Class<?>[] getServletConfigClasses() 10 { 11 return new Class<?>[] { WebMvcConfig.class }; 12 } 13 @Override 14 protected String[] getServletMappings() 15 { 16 return new String[] { "/" }; 17 } 18 @Override 19 protected Filter[] getServletFilters() { 20 return new Filter[]{ new OpenEntityManagerInViewFilter() }; 21 } 22 }
在我们的SpringWebAppInitializer.java配置类中,我们执行了以下操作:
为用户实体创建一个JPA实体User.java和一个Spring Data JPA存储库。
1 @Entity 2 public class User 3 { 4 @Id @GeneratedValue(strategy=GenerationType.AUTO) 5 private Integer id; 6 private String name; 7 //setters and getters 8 } 9 public interface UserRepository extends JpaRepository<User, Integer> 10 { 11 }
创建一个SpringMVC控制器来处理URL“/”并呈现用户列表。
1 @Controller 2 public class HomeController 3 { 4 @Autowired UserRepository userRepo; 5 @RequestMapping("/") 6 public String home(Model model) 7 { 8 model.addAttribute("users", userRepo.findAll()); 9 return "index"; 10 } 11 }
1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml" 3 xmlns:th="http://www.thymeleaf.org"> 4 <head> 5 <meta charset="utf-8"/> 6 <title>Home</title> 7 </head> 8 <body> 9 <table> 10 <thead> 11 <tr> 12 <th>Id</th> 13 <th>Name</th> 14 </tr> 15 </thead> 16 <tbody> 17 <tr th:each="user : ${users}"> 18 <td th:text="${user.id}">Id</td> 19 <td th:text="${user.name}">Name</td> 20 </tr> 21 </tbody> 22 </table> 23 </body> 24 </html>
现在我们已经准备好运行该应用程序。但是在此之前,我们需要在你的IDE中下载并配置服务器,例如Tomcat或Jetty或Wildfly等。
你可以下载Tomcat 8并在你喜欢的IDE中进行配置,运行该应用程序并将浏览器指向http:// localhost:8080/ springmvcjpa-demo。你应该在表中看到用户详细信息列表。
是的...我们做到了。
但是,等等。仅显示从数据库表中提取的用户详细信息列表是否不是一项繁重的工作?
让我们诚实和公平。所有这些配置不仅仅针对这一用例。此配置也是其余应用程序的基础。
但是同样,如果你想快速启动并运行,这是太多的工作要做。
另一个问题是,假设你要开发具有类似技术堆栈的另一个SpringMVC应用程序?
好了,你复制粘贴配置并进行调整。对?但是请记住一件事:如果你必须一次又一次地执行相同的操作,则应该找到一种自动的方法来执行此操作。
除了一遍又一遍地写相同的配置,你在这里还看到其他问题吗?
好吧,让我列出我在这里看到的问题。
想象一下,如果Spring能够自动配置bean呢?如果可以使用简单的可自定义属性自定义自动配置该怎么办?
例如,你不想将DispatcherServlet url-pattern映射到“/”,而是要将其映射到“/app/”。与其将Thymeleaf视图放置在“/ WEB-INF / views”文件夹中,不如将它们放置在“/WEB-INF/templates/”文件夹中。
因此,基本上,你希望Spring自动执行操作,但是提供了以更简单的方式覆盖默认配置的灵活性?
好吧,你即将进入SpringBoot的世界,梦想成真!!!
欢迎使用Spring Boot!Spring Boot确实可以满足你的需求。它会自动为你执行操作,但是允许你覆盖默认值。
与其从理论上解释,不如说我以身作则。
因此,让我们实现与之前构建的应用程序相同的应用程序,但是这次使用SpringBoot。
创建一个Maven项目并配置依赖项,如下所示:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 5 http://maven.apache.org/maven-v4_0_0.xsd"> 6 <modelVersion>4.0.0</modelVersion> 7 <groupId>com.sivalabs</groupId> 8 <artifactId>hello-springboot</artifactId> 9 <packaging>jar</packaging> 10 <version>1.0-SNAPSHOT</version> 11 <name>hello-springboot</name> 12 <parent> 13 <groupId>org.springframework.boot</groupId> 14 <artifactId>spring-boot-starter-parent</artifactId> 15 <version>1.3.2.RELEASE</version> 16 </parent> 17 <properties> 18 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 19 <java.version>1.8</java.version> 20 </properties> 21 <dependencies> 22 <dependency> 23 <groupId>org.springframework.boot</groupId> 24 <artifactId>spring-boot-starter-test</artifactId> 25 </dependency> 26 <dependency> 27 <groupId>org.springframework.boot</groupId> 28 <artifactId>spring-boot-starter-data-jpa</artifactId> 29 </dependency> 30 <dependency> 31 <groupId>org.springframework.boot</groupId> 32 <artifactId>spring-boot-starter-web</artifactId> 33 </dependency> 34 <dependency> 35 <groupId>org.springframework.boot</groupId> 36 <artifactId>spring-boot-starter-thymeleaf</artifactId> 37 </dependency> 38 <dependency> 39 <groupId>org.springframework.boot</groupId> 40 <artifactId>spring-boot-devtools</artifactId> 41 </dependency> 42 <dependency> 43 <groupId>mysql</groupId> 44 <artifactId>mysql-connector-java</artifactId> 45 </dependency> 46 </dependencies> 47 </project>
哇,我们的pom.xml突然变得如此之小!
1 spring.datasource.driver-class-name=com.mysql.jdbc.Driver 2 spring.datasource.url=jdbc:mysql://localhost:3306/test 3 spring.datasource.username=root 4 spring.datasource.password=admin 5 spring.datasource.initialize=true 6 spring.jpa.hibernate.ddl-auto=update 7 spring.jpa.show-sql=true
你可以将相同的data.sql文件复制到src / main / resources文件夹中。
创建与springmvc-jpa-demoapplication中相同的User.java,UserRepository.java和HomeController.java。
将我们在springmvc-jpa-demo应用程序中创建的/WEB-INF/views/index.html复制到新项目中的src/-main/resources/ templates文件夹中。
使用以下主要方法创建一个Java类Application.java:
1 @SpringBootApplication 2 public class Application 3 { 4 public static void main(String[] args) 5 { 6 SpringApplication.run(Application.class, args); 7 } 8 }
现在,将Application.java作为Java应用程序运行,并将浏览器指向http:// localhost:8080/。
你应该以表格格式看到用户列表。酷!!!
好吧好吧,我听到你在喊“发生了什么事??”。
让我解释一下发生了什么。
1. 轻松的依赖管理
2. 自动配置
3. 嵌入式Servlet容器支持
最重要和令人惊讶的事情是,我们创建了一个简单的Java类,该类以一些神奇的注释@SpringApplication进行了注释,该类具有main方法,并且通过运行该main方法,我们可以运行该应用程序并在http:// localhost:8080/进行访问。
servlet容器来自哪里?
我们添加了spring-boot-starter-web,它会自动拉出spring-boot-starter-tomcat,当我们运行main()方法时,它将tomcat作为嵌入式容器启动,这样我们就不必在任何应用程序上部署应用程序 外部安装的tomcat服务器。
顺便说一句,你是否注意到我们在pom.xml中的包装类型是“罐子”而不是“战争”。精彩!
好的,但是如果我想使用Jetty服务器而不是tomcat怎么办?
简单,将spring-bootstarter-tomcat从spring-boot-starter-web中排除,并包括spring-boot-starter-jetty。
而已。
但是,这看起来很神奇!!!
我可以想象你在想什么。你在想,SpringBoot看起来很酷,它会自动为我做很多事情。但是,我仍然不完全了解幕后工作的一切。对?
我能够了解。观看魔术表演通常很有趣,但是在软件开发中却不是。不用担心,我们将在以后的文章中仔细研究每件事,并详细说明幕后情况。但是,我现在不想在本文中将所有内容都丢给你而让你不知所措。
在本文中,我们快速概述了各种Spring配置样式,并了解了配置Spring应用程序的复杂性。另外,我们通过创建一个简单的Web应用程序快速浏览了SpringBoot。
在下一篇文章中,我们将深入研究SpringBoot并了解其工作原理。
感谢阅读!
标签:依赖 common 介绍 并且 nat 控制 java框架 驱动程序 hello
原文地址:https://www.cnblogs.com/youruike-/p/12360867.html