系列文章目录
Spring Boot是在Spring 基础上提供了一套全新的开源的框架,它具有 Spring 一切优秀特性,而且使用更加简单,功能更加丰富,性能更加稳定而健壮。Spring Boot 提供了大量开箱即用(out-of-the-box)的依赖模块,例如 spring-boot-starter-redis、spring-boot-starter-data-mongodb 和 spring-boot-starter-data-elasticsearch 等。这些依赖模块为 Spring Boot 应用提供了大量的自动配置,使得 Spring Boot 应用只需要非常少量的配置甚至零配置,便可以运行起来,让开发人员从 Spring 的“配置地狱”中解放出来,有更多的精力专注于业务逻辑的开发,即"约定大于配置"。
文章目录
前言
对象,类,包,模块,组件,容器,框架,这些java属于他们都有一个共同的特点:容纳.
对象(Object):
在java的世界里,对象是通过属性和方法来分别对应事物所具有的静态属性和动态属性.
类(Class):
用于描述同一类型的对象的一个抽象的概念.
对象和类的关系:
类是具有共同的属性名称和行为的一组对象的抽象,而对象则是一个类的真实的例子。
组件(component):
组件也是抽象的概念,可以理解为一些符合某种规范的类组合在一起就构成了组件。他可以提供某些特定的功能。
J2EE来说,有什么servlet,jsp, javabean,ejb都是组件。但实际他们都是类,只不过有他们特殊的规定。
组件和类的关系:符合某种规范的类的组合构成组件.
容器(Container):
容器也叫做组件容器,组件容器是一种比较特殊的组件,它可以包含其他的组件。我们可以把组件放在组件容器中。
反之,如果一个组件不是组件容器,则其中不能包含其他的组件。
组件容器也是一种组件,所以一个组件容器可以放在另一个组件容器中。
组件容器的出现使得事情变得复杂了起来。我们可以把组件放在组件容器里,也可以把组件容器放在另一个组件容器里,这样就形成了有层次的组件结构。
我们可以把普通的组件想像成为鸡蛋,而把组件容器想像成为篮子。
那么,鸡蛋可以放在小篮子里,小篮子和别的鸡蛋又可以放在大篮子里。于是 ,篮子里可以有鸡蛋,还可以有其他的篮子。
应博友要求,本篇主要讲述SVM的的近红外光谱定性分析建模方法
一、注册组件的4种方法
组件的注册,其实就是类的实现与反射,只有在容器中的组件,才会拥有SpringBoot提供的强大功能。常见的注册组件的方法如下4类。
- 1、包扫描+组件标注注解(@Component、@Service、@Controller、@Repository,主要是自己写的类
- 2、@Bean[导入的第三方包里面的组件]
- 3、@Import[快速给容器中导入一个组件]
-
1、Import(类名),容器中就会自动注册这个组件,id默认是组件的全名
-
2、ImportSelector:返回需要导入的组件的全类名的数组
-
3、ImportBeanDefinitionRegistrar:手动注册bean
- 4、使用Spring提供的FactoryBean(工厂bean)
-
1、默认获取到的是工厂bean调用getObject创建的对象
-
2、要获取到bean本身,需要给id前面加个&标识
- @Conditional({Condition}):按照一定的条件判断,满足条件给容器中注册bean
二、包扫描+组件标注注解
1、配置类,标明注解扫描的范围
//告诉Spring这是一个配置类
@Configuration
//注解所扫描的范围,类似于spring配置文件的 context:component-scan
@ComponentScan(value="com.java")
public class MainConfig {
}
2、注解
//标识表现层
@Controller
public class BookController {
}
三、@bean导入(最常用的方法)
对于一个创建person类而言
@NoArgsConstructor
//@AllArgsConstructor
@Data
@ToString
@EqualsAndHashCode
public class User {
private String name;
private Integer age;
private Pet pet;
public User(String name,Integer age){
this.name = name;
this.age = age;
}
}
使用@bean进行注册
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
//@ConditionalOnBean(name = "tom")
@ConditionalOnMissingBean(name = "tom")
@ImportResource("classpath:beans.xml")
//@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中
public class MyConfig {
/**
* Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
* @return
*/
@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Pet组件
zhangsan.setPet(tomcatPet());
return zhangsan;
}
@Bean("tom")
public Pet tomcatPet(){
return new Pet("tomcat");
}
}
查看是否注册成功
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
boolean user01 = run.containsBean("user01");
System.out.println("容器中user01组件:"+user01);
注意1:@Bean 在给容器中添加组件,默认以方法名作为组件的id,返回类型就是组件类型,返回的值,就是组件在容器中的实例。如果不想默认,@Bean中(“xxxxx”)设置组件的ID。
注意2:@Configuration(proxyBeanMethods = false or true) //这个属性是并不是决定容器中的组件是单例还是多例的。如果说他是true,就是单例。如果说是false,但却不是多例。当他为true的时候,我们在容器中获取到的对象总是同一个,即便是我们调用了创建对象的方法,那获取到的还是同一个。但是当是多例的时候,如果我们调用了创建对象的方法,那就不是同一个了。但是我们如果是用getBeans方法去获取的话,那样还是单例的,我们得到的还是同一个对象。默认为true。
四、@Conditional({Condition})注册
一般用于组件的依赖,只有@ConditionalOnBean(name = “tom”)注册的组件存在才会进行对该组件有依赖的组件进行注册。
* 4、@Import({User.class, DBHelper.class})
* 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
*
*
*
*/
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
}
五、@ImportResource注册
用于使用xml写的老版本组件的注册
@ImportResource("classpath:beans.xml")
其中,xml文件如下:
<bean id="haha" class="com.atguigu.boot.bean.User">
<property name="name" value="zhangsan"></property>
<property name="age" value="18"></property>
</bean>
<bean id="hehe" class="com.atguigu.boot.bean.Pet">
<property name="name" value="tomcat"></property>
</bean>