开发相关:
*使用@Autowired无法注入bean类
Consider defining a bean of type ‘xxx’ in your configuration.
1.@ComponentScan配合@Component、@Configuration、@Entity、@Repository、@Service等注解
@ComponentScan
@ComponentScan注解的basePackages属性可指定扫描的包路径(com.xxx),basePackages属性默认从被@ComponentScan所注解类的包路径开始向下扫描,因此SpringBoot的启动类最好位于源码根目录(com.xxx)。
@Component
组件类注解(通用),被@Repository和@Service包含。
@Configuration
配置类注解,作用相当于Spring在xml文件中定义bean。
@Entity
实体类注解,@Table(name=“表名”)作用于类上,@Id为主键字段,@Column为普通字段。
@Repository
DAO层注解,注入后bean的名称为类名的首字母小写,@Repository的value属性可指定bean的名称。
@Service
Service层注解,注入后bean的名称为类名的首字母小写,@Service的value属性可指定bean的名称。
2.使用@Import(xxx.class)注解在类名?
3.利用BeanDefinitionBuilder创建bean并注册到Spring容器
Tomcat不执行SpringApplication.run语句之后的所有代码,实现ApplicationListener接口的onApplicationEvent的方法可截获ApplicationContext ,在Tomcat完全启动SpringBoot项目前注入bean。
@Component
public class TomcatListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
ApplicationContext applicationContext = contextRefreshedEvent.getApplicationContext();
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(xxx.class);
defaultListableBeanFactory.registerBeanDefinition("xxx", beanDefinitionBuilder.getRawBeanDefinition());
Assert.notNull(applicationContext.getBean("xxx"));
}
}
编译相关:
*Error assembling WAR:webxml is required
指定maven-war-plugin版本3.1.0以上即可。
<?xml version="1.0" encoding="UTF-8"?>
<packaging>war</packaging>
。。。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifaceId>maven-war-plugin</artifaceId>
<version>3.1.0</version>
</plugin>
</plugins>
</build>
部署相关:
*部署到Tomcat不运行(无日志)
在IDE运行SpringBoot项目时使用的是SpringBoot集成的tomcat,部署到Tomcat服务器时SpringBoot的启动类需继承SpringBootServletInitializer并重写configure方法。
@SpringBootApplication
public class AppMain extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(AppMain.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(AppMain.class);
}
}