当前位置:  开发笔记 > 后端 > 正文

春天:对正确的学习路径的困惑

如何解决《春天:对正确的学习路径的困惑》经验,为你挑选了1个好方法。

过去几天我一直在教自己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答案的最佳场所.



1> M. Deinum..:
春天的历史非常短暂

让我们从一个历史课开始......这一年是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);
    }
}

弹簧配置 - 属性文件

在开始时,唯一的配置选项是使用属性文件.让我们命名这个文件application-context.properties.要创建上面的java类的实例并设置名称,application-context.properties需要以下内容.

hello.(class)=biz.deinum.samples.configurations.HelloWorld
hello.name=Marten!

(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();

然而,基于属性的配置有点限制,XML同意世界.因此,出生的XML配置的第一步.

Spring配置 - XML文件(第1部分)

要使用XML表示相同的配置,需要以下内容.




    
        
    


加载时,这将创建一个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();

Spring配置 - XML文件(第2部分)

XML非常冗长但可读.但是配置诸如AOP(例如事务),MVC等之类的东西是相当费力的.(或者像安全性这样的东西在没有命名空间的情况下看到Spring Security的前身).因此,新的和改进的XML具有命名空间的概念,允许诸如此类的东西 .

弹簧配置 - 注释驱动

下一步是引入Java5,允许注释.随着整个Java社区要求基于注释的配置,这被添加.因此,引进的@Component,@Autowired和喜欢.

添加@ComponentHelloWorld类并使用命名空间来启用组件扫描可以减少必须编写的XML数量.

假设@Component("hello")HelloWorld类中,则需要以下XML.




    


要加载此配置,只需更改要加载的文件的位置.

Spring配置 - Java配置

然后突然之间对XML的热爱结束了,人们想要使用他们所知道的语言,而语言就是Java.因此,基于Java的配置诞生了.

@Configuration
public class HelloWorldConfiguration {

    @Bean
    public HelloWorld hello() {
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.setName("Marten!");
        return helloWorld;
    }
}

@Bean注解的是,这种方法产生了豆和实际上由弹簧加载之前使用ASM进行处理的指示.但是Java Config处理非常复杂,只适用于ApplicationContext.您可以将@Configuration类添加到xml文件中并加载它以使其处理或使用专用AnnotationConfigApplicationContext来加载(或检测)它.

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
context.getBean("hello", HelloWorld.class).sayHello();

在XML中,我们使用命名空间来简化配置.在Java配置土地,我们有不同的@Enable*注解一样@EnableTransactionManagement是相同的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;
    }
}

这个类将启动应用程序,打个招呼,在上下文中打印一些信息并结束.没有您自己创建应用程序上下文或工厂.

为什么该类的@Bean方法HelloWorld在Spring Boot的默认组件扫描未涵盖的包中,因此我们需要声明bean.我们可以在HelloApplication类中执行此操作,因为这也是一个@Configuration(由于它是元注释@SpringBootApplication).

现在,如果您替换@SpringBootApplication,则@SpringBootApplication(scanBasePackageClasses = HelloWorld.class)可以删除@Bean注释,因为HelloWorld现在可以通过组件扫描检测到@ComponentScan注释(由元注释启用@SpringBootApplication).

可以在此处找到此答案的代码.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有