SpringBoot Study I

搭建一个maven工程,现在我们搭建一个项目

pom文件先建一个 我们看我们的maven仓库是空的

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>xxxx</artifactId>
    <version>0.0.1</version>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot-dependencies.version>1.5.2.RELEASE</spring-boot-dependencies.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>

    </dependencies>
</project>

当我们在dependencyManagement中加入spring-boot-dependencies的时候maven会自动导入jar包。

然而我们打开工程模块依赖的时候不会将该jar包加入到工程依赖中。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>xxxx</artifactId>
    <version>0.0.1</version>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot-dependencies.version>1.5.2.RELEASE</spring-boot-dependencies.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-dependencies.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>extjs</artifactId>
            <version>6.2.0</version>
        </dependency>
    </dependencies>
</project>

当我们在dependencies中加入extjs的时候maven会自动导入jar包。

我们打开工程依赖的时候将该jar包加入到工程依赖中。

----------------------------------------------------------------------------------------------------------------------------------------

注意:☆☆☆☆☆

ServletContainerInitializer:启动容器时负责加载相关配置


容器启动时会自动扫描当前服务中ServletContainerInitializer的实现类,并调用其onStartup方法。

其参数Set<Class<?>> c,可通过在实现类上声明注解javax.servlet.annotation.HandlesTypes(xxx.class)注解自动注入。

@HandlesTypes会自动扫描项目中所有的xxx.class的实现类,并将其全部注入Set。

@HandlesTypes({WebApplicationInitializer.class})
public class SpringServletContainerInitializer implements ServletContainerInitializer {
    public SpringServletContainerInitializer() {
    }

    public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException {
        List<WebApplicationInitializer> initializers = new LinkedList();
        Iterator var4;
        if (webAppInitializerClasses != null) {
            var4 = webAppInitializerClasses.iterator();

            while(var4.hasNext()) {
                Class<?> waiClass = (Class)var4.next();
                if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) && WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
                    try {
                        initializers.add((WebApplicationInitializer)waiClass.newInstance());
                    } catch (Throwable var7) {
                        throw new ServletException("Failed to instantiate WebApplicationInitializer class", var7);
                    }
                }
            }
        }

        if (initializers.isEmpty()) {
            servletContext.log("No Spring WebApplicationInitializer types detected on classpath");
        } else {
            servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");
            AnnotationAwareOrderComparator.sort(initializers);
            var4 = initializers.iterator();

            while(var4.hasNext()) {
                WebApplicationInitializer initializer = (WebApplicationInitializer)var4.next();
                initializer.onStartup(servletContext);
            }

        }
    }
}


对Spring Boot而言,@SpringBootApplication的作用就是@Configuration, @EnableAutoConfiguration与@ComponentScan的集合,所以也会存在@EnableAutoConfiguration的粒度管理问题。

添加@EnableAutoConfiguration时(请务必注意,一个Spring Boot程序最好只添加唯一一个这样的注解),由于Spring Boot是根据程序加载的jar包自动添加配置,所以就会导致自动配置一些不必要的配置,性能浪费倒是小事,关键是控制力度与问题难以追踪。

基于以上的原因,一般而言,@EnableAutoConfiguration只适用于初学者,对控制力与把控力要求的架构师或高级用户显然是不合适的,所以有必要找到@SpringBootApplication的替代方案,自己控制Bean创建的过程与数量。

参考:https://blog.csdn.net/yiifaa/article/details/72852572

------------------------------------------------------------------------------------------------------------------------------

SpringBoot获得application.properties中数据的几种方式

1)@Autowired

private Environment environment;

String xxx = environment.getProperty("xxx");

2)ConfigurableApplicationContext context=SpringApplication.run(SpringBoot01Application.class, args);

String str1=context.getEnvironment().getProperty("xxx");

3)@Value("${xxx.xxx}")

private String xxx;

注意:

1)使用@Value时获取配置文件中属性时,如果是application.properties,就不要写@PropertySource("application.properties"),其他要写。

参考:https://blog.csdn.net/qq_37171353/article/details/78005845




java中元注解有四个: @Retention @Target @Document @Inherited;

1) @Retention:注解的保留位置

@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含

@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得

@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

2)@Target:注解的作用目标

@Target(ElementType.TYPE) //接口、类、枚举、注解

@Target(ElementType.FIELD) //字段、枚举的常

@Target(ElementType.METHOD) //方法

@Target(ElementType.PARAMETER) //方法参数

@Target(ElementType.CONSTRUCTOR) //构造函数

@Target(ElementType.LOCAL_VARIABLE)//局部变量

@Target(ElementType.ANNOTATION_TYPE)//注解

@Target(ElementType.PACKAGE) ///包

3)@Document:说明该注解将被包含在javadoc中

4)@Inherited:说明子类可以继承父类中的该注解



猜你喜欢

转载自blog.csdn.net/jz1993/article/details/80802217