spring-boot的高度自动化有利有弊,好处就是利用约定大于配置大大降低了很多常规配置,只需要配置关键的东西即可。但是缺点就是很多情况下如果报错,很难查找,加上国内的springboot的文档并不多,这次我在spring boot 中使用了mongoDB做存储。
首先添resources下面加配置文件:
application.yaml
spring :
application :
name : 应用名字
server :
port : 8081
---
spring :
profiles : dev
data :
mongodb :
host : mongoDB所在地址
port : 27017
database : test
server :
port : 8080
---
spring :
profiles : pub
server :
port : 8082
---
spring :
profiles :
active : dev
启动应用application.java:
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.run(args);
}
}
注意的是这个启动类会去扫描当前包和子包的所有注解的bean,其实如果熟悉了spring的用户就知道典型的spring应用是需要指定扫描包的,springboot并没增加新特性,更多的是高度自动化了,所以扫描包的路径肯定有个默认值,这个默认值很正常就设定为当前包和子包了,所以经常报找不到bean的异常就可以检查一下,需要注入的bean是否属于当前加载类的默认扫描范围内。
mongoDB
要使用mongo完成的依赖如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
<version>1.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>
最开始我添加了spring-jpa的依赖,然后一致报错:
Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (the profiles "dev" are currently active)
后来移除spring-jpa的maven包就正常了,应该是 spring-jpa是ORM数据库的支持,一定要指定对应的驱动,我这个应用不需要关系数据库,所以移除即可解决问题。
定义model
public class User {
@Id
private String id;
private String name;
// setter getter
}
一定更注解id.这个是:
org.springframework.data.annotation.Id
如果是MySQL的Id注解引用的java.persistence包下面的Id注解。
定义Dao
public interface UserDao extends MongoRepository<User,Long> {
}
这样我们可以直接使用@Autowired 注入 UserDao使用MongoRepository提供的默认模版方法。如果模版方法不能够满足,我们可以自己定义:
public interface UserDao extends MongoRepository<User,Long> {
User getUserByName(String name);
}
模版方法会自动根据一些关键字去匹配,十分的“智能“。find, get, By都能够解析成对应的语义。具体支持的关键字,本文不详细解释,可以自己谷歌。