Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 春天:正确学习道路上的困惑_Spring_Spring Boot - Fatal编程技术网

Spring 春天:正确学习道路上的困惑

Spring 春天:正确学习道路上的困惑,spring,spring-boot,Spring,Spring Boot,在过去的几天里,我一直在自学SpringBoot,创建了一个RESTWeb服务服务器和客户端,然后添加了基本的身份验证,并部署为一个独立的war包。我通过整合弹簧启动机web,弹簧启动机测试,弹簧启动机,弹簧启动机安全,弹簧启动机tomcat,弹簧启动机web,来实现这一点,jackson数据绑定在我的gradle项目中,通过各种网站复制和修改 在被众多网站以完全不同的方式(完全不同的注释,一些配置文件的使用)做事情弄糊涂之后,它工作了,然后我使用拦截器/消息转换器、原始标题,然后通过rest模

在过去的几天里,我一直在自学SpringBoot,创建了一个RESTWeb服务服务器和客户端,然后添加了基本的身份验证,并部署为一个独立的war包。我通过整合
弹簧启动机web
弹簧启动机测试
弹簧启动机
弹簧启动机安全
弹簧启动机tomcat
弹簧启动机web
,来实现这一点,
jackson数据绑定
在我的gradle项目中,通过各种网站复制和修改

在被众多网站以完全不同的方式(完全不同的注释,一些配置文件的使用)做事情弄糊涂之后,它工作了,然后我使用拦截器/消息转换器、原始标题,然后通过rest模板生成器对其进行了修改

然而,我觉得我真的不知道它是如何工作的,也不知道为什么工作的,尽管我写了相当多的代码让它以4种不同的方式工作,包括基本身份验证。它只是神奇地工作了,我不喜欢它:例如,如果我想添加更多不基于“引导”的东西,我会怎么做,或者所有注释都在做什么,为什么需要它们,例如
@SpringBootApplication
@Configuration
,或者为什么有些类
@Bean
,而其他类则不需要)

长话短说,spring是一个庞大的框架(列出软件包的网站本身占据了一个页面),我真的应该先学习SpringCore/framework,然后再学习boot,也许是SpringMVC或SpringWeb服务

我可以找到很多关于教我各种软件包的资源,但是没有一个能告诉我它们为什么工作或者从哪里开始,特别是没有什么能告诉我这些软件包是如何相互关联的。这是非常压倒性的


我预计这将因为没有建设性而被关闭,但它似乎是获得Spring答案的最佳场所。

Spring框架它是关于依赖注入的,用于REST web服务,但这并不意味着在任何基本应用程序中都不能使用Spring

长话短说,spring是一个庞大的框架(列出软件包的网站本身占据了一个页面),我真的应该先学习SpringCore/framework,然后再学习boot,也许是SpringMVC或SpringWeb服务

您应该了解spring通常是如何工作的,以及实例化是如何工作的。基本上,它在您的项目中进行搜索,并实例化每个用
@Component
注释的类(
@Service
@RestController
@Controller
…等等)。当您
@Autowire
时,将向变量传递一个引用

在被众多网站以完全不同的方式(完全不同的注释,一些配置文件的使用)做事情弄糊涂之后,它工作了,然后我使用拦截器/消息转换器、原始标题,然后通过rest模板生成器对其进行了修改

你可以在互联网上找到的大多数超过1-2年的例子可能已经过时了(但并不总是如此)。当你寻找某样东西时,请记住这一点。这是实现如此之多的主要原因

我可以找到很多关于教我各种软件包的资源,但是没有一个能告诉我它们为什么工作或者从哪里开始,特别是没有什么能告诉我这些软件包是如何相互关联的。这是非常压倒性的

这是压倒性的。这是一个具有广泛适用性的大框架。了解事物如何运作的最佳场所是:

一段非常短暂的春天历史 让我们从一节历史课开始。。。这一年是2002年,大多数Java开发人员都在J2EE领域工作,他们中的很多人都不高兴。其中一位是Rod Johnson,他写了一本书,名叫《如何在没有EJB的情况下以更好的方式开发企业应用程序》。这本书的代码成为了Spring框架的基础。p> 弹簧配置 让我们来看一个简单的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);
    }
}
Spring配置-属性文件 一开始,唯一的配置选项是使用属性文件。将此文件命名为
应用程序上下文.properties
。要创建上面java类的实例并设置名称,需要
应用程序context.properties
中的以下内容

hello.(class)=biz.deinum.samples.configurations.HelloWorld
hello.name=Marten!
(类)
是一个特殊属性(更像是
(范围)
(抽象)
,请参阅以获取更多选项。这将指示需要加载哪个类。要使用属性文件,必须创建一个
BeanFactory
的过程。(如果您需要像AOP这样的奇特功能,则可以将其传递给
ApplicationContext

然而,基于属性的配置有一点局限性,XML正在世界各地流行。因此,XML配置的第一步就诞生在哪里

Spring配置-XML文件(第1部分) 要用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>
Spring配置-XML文件(第2部分) XML非常冗长,但可读性很强。但是配置AOP(例如事务)、MVC等非常费力。(或者安全性之类的东西,请参阅没有名称空间的Spring security的前身)因此,新的和改进的XML具有名称空间的概念,允许像
这样的事情。Spring Boot看到这一点的原因之一

将类标记为
@SpringBootApplication
将使该类成为
@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;
    }
}
这个类将启动应用程序,打招呼,打印一些上下文信息并结束
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("classpath:/applicationContext-basic.xml");

HelloWorld helloWorld = beanFactory.getBean("hello", HelloWorld.class);
helloWorld.sayHello();
<?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>
@Configuration
public class HelloWorldConfiguration {

    @Bean
    public HelloWorld hello() {
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.setName("Marten!");
        return helloWorld;
    }
}
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class);
context.getBean("hello", HelloWorld.class).sayHello();
@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;
    }
}