Nei*_*ker 7 spring spring-boot
过去几天我一直在教自己Spring Boot并创建了一个REST Web服务服务器和客户端,然后添加了基本身份验证,并作为独立和war包部署.我这样做,通过整合spring-boot-starter-web,spring-boot-starter-test,spring-boot-starter,spring-boot-starter-security,spring-boot-starter-tomcat,spring-web,jackson-databind在我的项目的gradle和复制HTEN修改通过各种网站.
在众多网站以完全不同的方式处理(完全不同的注释,一些配置文件的使用)之后,它变得困惑了,然后我使用拦截器/消息转换器,原始标头然后通过休息模板构建器修改它.
但是,我觉得我真的不知道它是如何或为什么有效的,尽管我用4种不同的方式编写了相当多的代码来完成所有工作,包括基本身份验证.它只是神奇地工作,我不喜欢它:例如,如果我想添加更多不是"启动"的东西,我将如何做,或者所有注释都在做什么以及为什么需要它们,例如@SpringBootApplication,@Configuration或为什么某些课程@Bean和其他课程没有).
简而言之,spring是一个庞大的框架(列出软件包的网站本身就是一个页面),我应该先学习spring core/framework之前的东西,然后在学习启动之前可能会使用spring MVC或spring web services ?
我可以找到许多资源来教我各种软件包,但没有一个能告诉我它们为什么工作或者从哪里开始,特别是什么都没有告诉我这些软件包是如何相互链接的.这是非常压倒性的.
我希望这会被关闭而不是建设性的,但它似乎是获得Spring答案的最佳场所.
让我们从一个历史课开始......这一年是2002年,大多数Java开发人员一直在J2EE领域工作,其中很多人都不高兴.其中一个是Rod Johnson,他写了一本名为Expert One-on-One J2EE设计和开发的书,它是如何在没有EJB和更好的方式的情况下开发企业应用程序的.本书的代码成为Spring Framework的基础.
让我们看一个简单的Java类.
@Component("hello")
public class HelloWorld {
private String name = "World!";
public void setName(String name) {
this.name=name;
}
public void sayHello() {
System.out.println("Hello, " + name);
}
}
Run Code Online (Sandbox Code Playgroud)
在开始时,唯一的配置选项是使用属性文件.让我们命名这个文件application-context.properties.要创建上面的java类的实例并设置名称,application-context.properties需要以下内容.
hello.(class)=biz.deinum.samples.configurations.HelloWorld
hello.name=Marten!
Run Code Online (Sandbox Code Playgroud)
这(class)是一个特殊的属性(有更多的喜欢(scope)和(abstract)看到更多选项的javadoc.这将指示需要加载哪个类.要使用属性文件,必须创建a.的PropertiesBeanDefinitionReader传递BeanFactory.(反过来可以是ApplicationContext如果你需要像AOP这样的花哨功能,那就转到了
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
PropertiesBeanDefinitionReader reader = new PropertiesBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("classpath:application-context.properties");
HelloWorld helloWorld = beanFactory.getBean("hello", HelloWorld.class);
helloWorld.sayHello();
Run Code Online (Sandbox Code Playgroud)
然而,基于属性的配置有点限制,XML同意世界.因此,出生的XML配置的第一步.
要使用XML表示相同的配置,需要以下内容.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="hello" class="biz.deinum.samples.configurations.HelloWorld">
<property name="name" value="Marten!" />
</bean>
</beans>
Run Code Online (Sandbox Code Playgroud)
加载时,这将创建一个HelloWorld与属性文件具有相同设置的实例.加载它需要一个XmlBeanDefinitionReader.
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("classpath:/applicationContext-basic.xml");
HelloWorld helloWorld = beanFactory.getBean("hello", HelloWorld.class);
helloWorld.sayHello();
Run Code Online (Sandbox Code Playgroud)
XML非常冗长但可读.但是配置诸如AOP(例如事务),MVC等之类的东西是相当费力的.(或者像安全性这样的东西在没有命名空间的情况下看到Spring Security的前身).因此,新的和改进的XML具有命名空间的概念,允许诸如此类的东西<tx:annotation-driven /> <aop:config />.
下一步是引入Java5,允许注释.随着整个Java社区要求基于注释的配置,这被添加.因此,引进的@Component,@Autowired和喜欢.
添加@Component到HelloWorld类并使用命名空间来启用组件扫描可以减少必须编写的XML数量.
假设@Component("hello")在HelloWorld类中,则需要以下XML.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="biz.deinum.samples.configurations" />
</beans>
Run Code Online (Sandbox Code Playgroud)
要加载此配置,只需更改要加载的文件的位置.
然后突然之间对XML的热爱结束了,人们想要使用他们所知道的语言,而语言就是Java.因此,基于Java的配置诞生了.
@Configuration
public class HelloWorldConfiguration {
@Bean
public HelloWorld hello() {
HelloWorld helloWorld = new HelloWorld();
helloWorld.setName("Marten!");
return helloWorld;
}
}
Run Code Online (Sandbox Code Playgroud)
该@Bean注解的是,这种方法产生了豆和实际上由弹簧加载之前使用ASM进行处理的指示.但是Java Config处理非常复杂,只适用于ApplicationContext.您可以将@Configuration类添加到xml文件中并加载它以使其处理或使用专用AnnotationConfigApplicationContext来加载(或检测)它.
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
context.getBean("hello", HelloWorld.class).sayHello();
Run Code Online (Sandbox Code Playgroud)
在XML中,我们使用命名空间来简化配置.在Java配置土地,我们有不同的@Enable*注解一样@EnableTransactionManagement是相同的<tx:annotation-driven />XML格式.
使用哪个配置选项,如果你是新的我建议从基于Java的配置开始,虽然XML可能更容易理解(恕我直言).所有配置选项今天仍然有效,如果需要,您甚至可以混合搭配.
对于Spring来说无关紧要,对于Spring来说,重要的BeanDefinition是用于构造它们的源(属性,xml或java配置)并不重要.
到目前为止,唯一涵盖的是Spring本身.没有其他项目被触及(虽然已经提到).但正如您可以想象的那样,随着配置和应用程序复杂性的增加,我们需要更多的约定优于配置.Spring Boot看到光明的原因之一.
标记类@SpringBootApplication使该类成为a @Configuration,将启用组件扫描(从带注释的类所在的同一个包开始)并启用自动配置.
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(HelloApplication.class, args);
BeanFactoryHelper.sayHello(context);
BeanFactoryHelper.statistics(context);
}
@Bean
public HelloWorld hello() {
HelloWorld hello = new HelloWorld();
hello.setName("Marten!");
return hello;
}
}
Run Code Online (Sandbox Code Playgroud)
这个类将启动应用程序,打个招呼,在上下文中打印一些信息并结束.没有您自己创建应用程序上下文或工厂.
为什么该类的@Bean方法HelloWorld在Spring Boot的默认组件扫描未涵盖的包中,因此我们需要声明bean.我们可以在HelloApplication类中执行此操作,因为这也是一个@Configuration(由于它是元注释@SpringBootApplication).
现在,如果您替换@SpringBootApplication,则@SpringBootApplication(scanBasePackageClasses = HelloWorld.class)可以删除@Bean注释,因为HelloWorld现在可以通过组件扫描检测到@ComponentScan注释(由元注释启用@SpringBootApplication).
可以在此处找到此答案的代码.
| 归档时间: |
|
| 查看次数: |
1917 次 |
| 最近记录: |