组件添加
@Configuration
-
Full模式与Lite模式
配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
#############################Configuration使用示例######################################################
/*
* 1.配置类使用@Bean在方法上进行标注给容器注册组件,默认是单例的
*2.配置类本身也是组件
*3.@Configuration的参数proxyBeanMethods默认为true,proxyBeanMethods:代理bean的方法,如果为false,则再调用代理组件对方法进行调用时会产生新对象【每个@Bean方法被调用多少次返回的组件都是新创建的】
* Full模式(proxyBeanMethods=true)【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
* Lite【轻量级模式】(proxyBeanMethods=false)组件依赖时别用,不过会提高速度(但是会出现多例)
* 4.@Import({User.class,DBHelper.class})
* 给容器中自动创建出这两个类型的组件,默认组件的名字就是全限名
* 5.@ConditionalXXX注解,各种条件装配,具体作用看名字就能明白
* 6.@ImportResource,将spring原生的配置文件进行组件注册
* dispatcherServlet也是通过@Bean进行组件注册了的
*
* */
@Import(User.class)
@ImportResource("classpath:beans.xml") //将spring原生的配置文件进行组件注册
@Configuration(proxyBeanMethods=true)//告诉springboot这是一个配置类,等同于以前的配置文件,默认为true
@EnableConfigurationProperties(Car.class)//1.开启car的配置绑定功能 2.把car.class注册到组件当中
public class MyConfig {
/*外部无论对配置类中的组件注册方法进行多少次调用,获取的都是之前的注册容器中的单实例对象*/
// @ConditionalOnBean(name="testPet")//条件装配之一,有name为testPet的组件该组件才会注册在容器中
@Bean//给容器中添加组件,以方法名作为组件的id,返回类型为组件类型
// 返回的值,就是组件在容器中的实例(做spring的工作,默认为单例)
public User testUser(){
//这表明user组件依赖了pet组件
User zhangsan = new User("zhangsan",15);
zhangsan.setPet(new Pet("zhangsandemao",3));
return zhangsan;
}
@Bean("testPet")//如果不想以方法名作为id,可以手动修改
public Pet testPet(){
return new Pet("tomcat",2);
}
}
################################@Configuration测试代码如下########################################
/*
* 主程序类
* @SpringBootApplication:这是一个springboot应用
* @SpringBootApplication (scanBasePackages = "包名"),将包及其子级包的所有类纳入主程序控制下
* @SpringBootApplication等同于( @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan)之和
* */
@SpringBootApplication //(scanBasePackages = "com.fallingwhite.boot")不写默认为当前包及其子级包
public class MainApplication {
public static void main(String[] args) {
// SpringApplication.run(MainApplication.class,args); //测试启动
//1.返回ioc容器
ConfigurableApplicationContext run= SpringApplication.run(MainApplication.class,args);
//2.查看容器中组件
String[] names=run.getBeanDefinitionNames();
for(String name:names){
System.out.println(name);
}
//在控制台可以查看到DispatcherServlet,characterEncodingFilter等,也就是说springmvc的功能已全部处理
//3.从容器中获取组件
Pet pet01 =run.getBean("testPet",Pet.class);
Pet pet02 =run.getBean("testPet",Pet.class);
System.out.println("Pet是否为单例:"+(pet01==pet02));
//查看myconfig类是否为组件 com.fallingwhite.boot.config.MyConfig$$EnhancerBySpringCGLIB$$1eff0133@c7a977f
MyConfig bean=run.getBean(MyConfig.class);
System.out.println(bean);
//测试调用方法是从容器中拿取单例还是普通调用
//逻辑为@Configuration(proxyBeanMethods=true)代理对象调用方法,springboot总会检查这个组件是否在容器中,从而保证组件的单实例
//@Configuration(proxyBeanMethods=false)代理则会出现多例,同理,出现组件依赖时也是一样
User user01=bean.testUser();
User user02=bean.testUser();
System.out.println("User是否为单例:"+(user01==user02));
}
}
@Bean、@Component、@Controller、@Service、@Repository
将组件注册到容器当中
@ComponentScan、@Import
* 4、@Import({User.class, DBHelper.class})
* 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
*
*
*
*/
@Import({User.class, DBHelper.class})
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
}
@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
=====================测试条件装配==========================
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个配置类 == 配置文件
//@ConditionalOnBean(name = "testPet1")
@ConditionalOnMissingBean(name = "testPet1")
public class MyConfig {
/**
* Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象
* @return
*/
@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user01(){
User zhangsan = new User("zhangsan", 18);
//user组件依赖了Pet组件
zhangsan.setPet(testPet());
return zhangsan;
}
@Bean("testPet")
public Pet testPet(){
return new Pet("tomcat");
}
}
public static void main(String[] args) {
//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] names = run.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
boolean testPet1 = run.containsBean("testPet1");
System.out.println("容器中Tom组件:"+testPet1);
boolean user01 = run.containsBean("user01");
System.out.println("容器中user01组件:"+user01);
boolean testPet = run.containsBean("testPet");
System.out.println("容器中testPet组件:"+testPet);
}
原生配置文件引入
@ImportResource
======================beans.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 https://www.springframework.org/schema/context/spring-context.xsd">
<!--在以前的配置中我们所用的方法,springboot是无法识别的,可以通过@ImportResource进行导入-->
<bean id="user01" class="com.fallingwhite.boot.bean.User">
<property name="name" value="lisi"/>
<property name="age" value="15"/>
</bean>
<bean id="cat01" class="com.fallingwhite.boot.bean.Pet">
<property name="name" value="lisidemao"/>
<property name="age" value="3"/>
</bean>
</beans>
@ImportResource("classpath:beans.xml")
public class MyConfig {}
======================测试=================
boolean user01 = run.containsBean("user01");
boolean cat01 = run.containsBean("cat01");
System.out.println("user01:"+user01);//true
System.out.println("cat01:"+cat01);//true
小插件
**Lombok:**用于简化JavaBean开发与日志的自动生成,不过需要先在idea的插件页面进行添加,没有的话重启idea,可能是网络问题
<!--引入可以自动生成getter和setter以及日志等注解的插件lombok的依赖,用于减少JavaBean的开发-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
/*
* 只有在容器中的组件,才会有springboot提供的强大功能
* 第一种方式:@Component
@ConfigurationProperties连用
第二种,只写@ConfigurationProperties,在@Configuration类上标注@EnableConfigurationProperties(Car.class)来开启属性配置功能
* */
//@Component//将组件放入容器
/*lombok下的注解 @NoArgsConstructor @AllArgsConstructor @ToString @Data */
@NoArgsConstructor //自动生成无参构造器
@AllArgsConstructor //自动生成有参构造函数(参数为所有属性)
@ToString //自动重写toString
@Data //自动生成getter个setter
@EqualsAndHashCode //重写EqualsAndHashCode 方法
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private Integer price;
}
@Slf4j //自动生成日志,在调用方法中使用log进行日志生成, 属于Lombok
@RestController/*
等同于
@Controller
@ResponseBody
打开源码我们可以发现,这其实就是上两个注释的合并*/
public class ControllerOutOfMain {
@RequestMapping("/hello2")
public String handle01(){
log.info("请求成功");//日志测试
return "Hello2";
}
}
Dev-tools
用于快速重新启动的插件,实际意义不大
<!--自动重新启动,在改动代码后按下ctrl+F9即可查看效果,如果想使用热更新功能得使用付费的jRebel-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
Idea自带的Spring Initializr(多坑注意)
首先将maven仓库定位到自己的
设置为自己maven仓库的目录
再进行新项目的构建
因为idea部分版本与maven3.3以上版本有不兼容现象,所以可能会出现依赖缺失现象
eg:spring-boot-maven-plugin error。
各种jar包缺失无法解决。
甚至连project标签也error
解决方案
在maven的安装目录的conf目录下
(我这里是E:\maven\apache-maven-3.6.3\conf)
修改settings.xml
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
如果有jar包缺失实在无法解决,可以选择手动导入的方式
1.在maven官网上通过idea的报错信息下载缺失的包
2.通过cmd命令添加进maven仓库
格式如下
mvn install:install-file -Dfile=jar包的位置(参数一) -DgroupId=groupId(参数二) -DartifactId=artifactId(参数三) -Dversion=version(参数四) -Dpackaging=jar
例子:mvn install:install-file -Dfile=“E:\maven\apache-maven-3.6.3\repository\junit\assertj-core-3.18.1.jar” -DgroupId=org.junit.jupiter -DartifactId=assertj-core -Dversion=3.18.1 -Dpackaging=jar
注意:不能换行,除了install后第一个“-”外,所有的“-”都在前面有一个空格。
最后,刷新一下pom文件,就大功告成