spring boot 扫描包注释用的是哪个包

随笔 - 849&
文章 - 11&评论 - 171&trackbacks - 0
http://my.oschina.net/u/1027043/blog/406558&
&&&散仙写了一个很简单的入门级的Spring Boot的例子,没啥技术含量,不过,其实学任何东西只要找到第一个突破口,接下来的事情就好办了,人最怕什么? 我想莫过于干一件事情,没有下手的地方了,而当你一旦找到了这感觉,就可以很喜悦的顺藤摸瓜般的探索你强烈想探索求知的某种事物了,这种冥冥之中玄而又玄的感觉是什么?回想一下:&(1) 当你把第一个某种编程语言的Hello World的例子,成功的运行在一个IDE中&(2) 当你第一次从老家出发到达了某个你从未涉足过的地方&(3) 当你成功的完成了第一次网购&一切的不相关的事物之间的,其实都有类似的学习历程,正是所谓的触类旁通,万法归宗!&关于Spring Boot这块,其实里面涉及的内容非常多也非常灵活,散仙的项目中用到的模块也只是冰山一角,不可能完全覆盖所有有关的模块,完全是为了项目而用技术,不是为了技术而诞生了这个项目,所以这次记录的心得,完全是项目有关的,而不是Spring Boot一个学习教程,这一点,希望各位看官明白,如果想专攻学习Spring Boot,推荐点击官网更详细的&一个项目是由多种不同层面的技术组成的,所以散仙不会只写有关Spring Boot方面的,虽然Spring Boot是主线。大多数情况下,都会集成多种不同的技术,只有各自发挥自己擅长的优势,才能组合出最优的架构。&好了,多说了点废话,下面看下本篇记录Spring Boot的几个知识点:&(一)一个Maven+Spring Boot项目基本的包结构形式&(二)一个简单的在Spring Boot项目集成安全控制&(二)如何在Spring Boot中记录log日志&(四)Spring Boot中几个常用注解介绍&ok下面开始正题:&(一)先看下,官网给出的一个简单的包结构组成:&
Java代码&&&
&+-&example&&
&&&&&+-&myproject&&
&&&&&&&&&+-&Application.java&&
&&&&&&&&&|&&
&&&&&&&&&+-&domain&&
&&&&&&&&&|&&&+-&Customer.java&&
&&&&&&&&&|&&&+-&CustomerRepository.java&&
&&&&&&&&&|&&
&&&&&&&&&+-&service&&
&&&&&&&&&|&&&+-&CustomerService.java&&
&&&&&&&&&|&&
&&&&&&&&&+-&web&&
&&&&&&&&&&&&&+-&CustomerController.java&&
然后,看下散仙实际工作中的项目结构:&&&&需要注意的地方如下:&1,在src/main/java包下的第一层结构中,是必须放一个含有main方法的主启动的类,而且只能有一个main方法,如果再出现其他的main方法,在使用maven编译打包时,会报编译错误,当然在src/test/java包下,可以出现多个,但建议最好使用Junit进行单元测试.&这个main方法启动,就会启动内嵌的tomcat或jetty容器,然后加载所有需要加载的或扫描的类或资源文件。上篇博客中,散仙为了测试方便,是直接在当前的Conroller中,启动了一个测试服务,这样做适合单独调试,如果是生产环境下的启动方法,则是散仙前面所讲的,在java包的根目录下建立一个main方法类,负责启动所有的资源。&在本例中,散仙的main代码如下:&
Java代码&&&
package&com.dhgate.&&
import&org.springframework.boot.SpringA&&
import&org.springframework.boot.autoconfigure.EnableAutoC&&
import&org.springframework.ponentS&&
import&org.springframework.context.annotation.C&&
@Configuration//配置控制&&
@EnableAutoConfiguration//启用自动配置&&
@ComponentScan//组件扫描&&
public&class&ApplicationMain&{&&
&&&&public&static&void&main(String[]&args)&throws&Exception&{&&
&&&&&&&&//启动Spring&Boot项目的唯一入口&&
&&&&&&&&SpringApplication.run(ApplicationMain.class,&args);&&
2,在src/main/resource目录下面,是放置一些配置文件,或模板支持的文件,如JSP,Velocity,Freemaker等,这里面比较常用或重要的一个文件,就是Spring Boot的集中式配置文件application.properties这个文件了,这里面给其他大部分的组件,提供了一个可集中管理和配置的中心,包括安全控制,redis,solr,mangodb的连接信息,以及数据库连接池,容器端口号,jmx,java mail,动态模板等。此外这个目录下默认是可以访问静态资源的,比如我们的css,js,或者第三方的一些引用文件等。&(二)关于在Spring Boot的配置简单的安全访问控制,这一点非常容器,我们只需要做如下二步,即可。&1,在pom文件中,引入spring-boot-starter-security的maven依赖。&
Xml代码&&&
&dependency&&&
&&&&&&&&&groupId&org.springframework.boot&/groupId&&&
&&&&&&&&&artifactId&spring-boot-starter-security&/artifactId&&&
&&&&&/dependency&&&
2,在application.properties中,配置访问的用户名和密码&
Java代码&&&
#用户名&密码配置&&
security.user.name=admin&&
security.user.password=test&&
再次,访问链接时,会出现以下,拦截页面,就代表配置成功:&&当然这只是,一个初级的配置,更复杂的配置,可以分不用角色,在控制范围上,能够拦截到方法级别的权限控制。&(三)日志的重要性,不言而喻,Spring Boot支持大部分的log配置,其中包括:&(1)java util logging&(2)log4j&(3)log4j2&(4)logbak&默认的情况下spring boot会选择logback作为日志记录的载体,当然要想它正常的工作,需要依赖 Commons Logging, Java Util Logging, Log4J 或 SLF4J,相信大部分同学都是选择使用log4j.properties作为我们的日志配置和管理,但是散仙在Spring Boot中一直没有测试集成成功,所以就放弃使用log4j.properties作为日志载体,而是选择了Spring Boot推荐的logbak作为日志的配置文件,用过之后感觉也不错。&使用步骤:&1,将logbak.xml拷贝至resource目录下的根目录,然后在logbak.xml中,配置相关的log生成规则,log级别,以及日志路径,log的字符编码集,这个非常重要,因为刚开始用这个log记录程序运行的信息时,发现它不支持中文log,后来经查名,需要配置相关的log编码才可以正确记录对应的信息。一个通用的配置如下:&
Xml代码&&&
&!--&Logback&configuration.&See&http://logback.qos.ch/manual/index.html&--&&&
&configuration&scan="true"&scanPeriod="10&seconds"&&&
&&&!--&Simple&file&output&--&&&
&&&appender&name="FILE"&class="ch.qos.logback.core.rolling.RollingFileAppender"&&&
&&&&&!--&encoder&defaults&to&ch.qos.logback.classic.encoder.PatternLayoutEncoder&--&&&
&&&&&encoder&&&
&&&&&&&&&pattern&&&
&&&&&&&&&&&&[&%-5level]&[%date{yyyy-MM-dd&HH:mm:ss}]&%logger{96}&[%line]&-&%msg%n&&
&&&&&&&&&/pattern&&&
&&&&&&&&&charset&UTF-8&/charset&&&!--&此处设置字符集&--&&&
&&&&&/encoder&&&
&&&&&rollingPolicy&class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&&&
&&&&&&&!--&rollover&daily&配置日志所生成的目录以及生成文件名的规则&--&&&
&&&&&&&fileNamePattern&logs/mylog-%d{yyyy-MM-dd}.%i.log&/fileNamePattern&&&
&&&&&&&timeBasedFileNamingAndTriggeringPolicy&&
&&&&&&&&&&class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"&&&
&&&&&&&&&!--&or&whenever&the&file&size&reaches&64&MB&--&&&
&&&&&&&&&maxFileSize&64&MB&/maxFileSize&&&
&&&&&&&/timeBasedFileNamingAndTriggeringPolicy&&&
&&&&&/rollingPolicy&&&
&&&&&filter&class="ch.qos.logback.classic.filter.ThresholdFilter"&&&
&&&&&&&level&DEBUG&/level&&&
&&&&&/filter&&&
&&&&&!--&Safely&log&to&the&same&file&from&multiple&JVMs.&Degrades&performance!&--&&&
&&&&&prudent&true&/prudent&&&
&&&/appender&&&
&&&!--&Console&output&--&&&
&&&appender&name="STDOUT"&class="ch.qos.logback.core.ConsoleAppender"&&&
&&&&&!--&encoder&defaults&to&ch.qos.logback.classic.encoder.PatternLayoutEncoder&--&&&
&&&&&&&encoder&&&
&&&&&&&&&&&pattern&&&
&&&&&&&&&&&&&&[&%-5level]&[%date{yyyy-MM-dd&HH:mm:ss}]&%logger{96}&[%line]&-&%msg%n&&
&&&&&&&&&&&/pattern&&&
&&&&&&&&&&&charset&GBK&/charset&&&!--&此处设置字符集&--&&&
&&&&&&&/encoder&&&
&&&&&!--&Only&log&level&WARN&and&above&--&&&
&&&&&filter&class="ch.qos.logback.classic.filter.ThresholdFilter"&&&
&&&&&&&level&WARN&/level&&&
&&&&&/filter&&&
&&&/appender&&&
&&&!--&Enable&FILE&and&STDOUT&appenders&for&all&log&messages.&&
&&&&&&&By&default,&only&log&at&level&INFO&and&above.&--&&&
&&&root&level="INFO"&&&
&&&&&appender-ref&ref="FILE"&/&&&
&&&&&appender-ref&ref="STDOUT"&/&&&
&&&/root&&&
&&&!--&For&loggers&in&the&these&namespaces,&log&at&all&levels.&--&&&
&&&logger&name="pedestal"&level="ALL"&/&&&
&&&logger&name="hammock-cafe"&level="ALL"&/&&&
&&&logger&name="user"&level="ALL"&/&&&
&/configuration&&&
2,在application.properties中,指定log文件的加载路径,已经配置通用的log日志级别:&
Java代码&&&
#指定log的配置文件,以及记录Spring&Boot的log级别&&
logging.config=logback.xml&&
logging.level.org.springframework.web:&INFO&&
(四)介绍下Spring Boot中几个常用的注解,其中大部分都是来自Spring MVC的注解,这些注解使用的频率一般都在90%之上。&(1)@RestController和@Controller指定一个类,作为控制器的注解&(2)@RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉&(3)@EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器&(4)@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类&(5)@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上&(6)@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。&(7)@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean&(8)@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。&ok,本篇的讲解,就到此结束,这些都是项目工程的基础知识,了解这些,有助于我们快速的上手一个Spring Boot应用。&下篇博客的内容会写:&(1)如何在Spring Boot项目中集成Spring Loaded框架,来完成模块热加载和代码动态编译,有了这个东西,我们开发的效率会更加高效,大部分情况下我们改了一个类或方法的代码之后,都不需要重启应用,因为Spring Loaded会定时重新编译并加载代码。&(2)如何在Spring Boot项目中集成Velocity,Spring Boot支持多种模板引擎,包括&1,FreeMarker&2,Groovy&3,Thymeleaf&4,Velocity&5,JSP (Spring Boot官方不推荐)&我们可以根据熟悉程度来选择自己喜欢的引擎。&
阅读(...) 评论()spring boot 依赖的jar包怎么解决_百度知道spring(11)
之前用户使用的是3个注解注解他们的main类。分别是@Configuration,@EnableAutoConfiguration,@ComponentScan。由于这些注解一般都是一起使用,spring boot提供了一个统一的注解@SpringBootApplication。
@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
@SpringBootApplication
public class ApplicationMain {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
分开解释@Configuration,@EnableAutoConfiguration,@ComponentScan。
1、@Configuration:提到@Configuration就要提到他的搭档@Bean。使用这两个注解就可以创建一个简单的spring配置类,可以用来替代相应的xml配置文件。
&bean id = &car& class=&com.test.Car&&
&property name=&wheel& ref = &wheel&&&/property&
&bean id = &wheel& class=&com.test.Wheel&&&/bean&
@Configuration
public class Conf {
public Car car() {
Car car = new Car();
car.setWheel(wheel());
public Wheel wheel() {
return new Wheel();
} @Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。
2、@EnableAutoConfiguration:能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。
3、@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5720次
排名:千里之外
原创:45篇
转载:27篇
(6)(7)(11)(10)(2)(18)(7)(12)(2)Spring Boot中的缓存支持(一)注解配置与EhCache使用 - 简书
下载简书移动应用
写了96228字,被698人关注,获得了569个喜欢
Spring Boot中的缓存支持(一)注解配置与EhCache使用
随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一。Spring 3开始提供了强大的基于注解的缓存支持,可以通过注解配置方式低侵入的给原有Spring应用增加缓存功能,提高数据访问性能。
在Spring Boot中对于缓存的支持,提供了一系列的自动化配置,使我们可以非常方便的使用缓存。下面我们通过一个简单的例子来展示,我们是如何给一个既有应用增加缓存功能的。
首先,下载样例工程。本例通过spring-data-jpa实现了对User用户表的一些操作,若没有这个基础,可以先阅读一文对数据访问有所基础。
为了更好的理解缓存,我们先对该工程做一些简单的改造。
application.properties文件中新增spring.jpa.properties.hibernate.show_sql=true,开启hibernate对sql语句的打印
修改单元测试ApplicationTests,初始化插入User表一条用户名为AAA,年龄为10的数据。并通过findByName函数完成两次查询。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests {
@Autowired
private UserRepository userR
public void before() {
userRepository.save(new User("AAA", 10));
public void test() throws Exception {
User u1 = userRepository.findByName("AAA");
System.out.println("第一次查询:" + u1.getAge());
User u2 = userRepository.findByName("AAA");
System.out.println("第二次查询:" + u2.getAge());
执行单元测试,我们可以在控制台中看到下面内容。
Hibernate: insert into user (age, name) values (?, ?)
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?
第一次查询:10
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?
第二次查询:10
在测试用例执行前,插入了一条User记录。然后每次findByName调用时,都执行了一句select语句来查询用户名为AAA的记录。
在pom.xml中引入cache依赖,添加如下内容:
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-cache&/artifactId&
&/dependency&
在Spring Boot主类中增加@EnableCaching注解开启缓存功能,如下:
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
在数据访问接口中,增加缓存配置注解,如:
@CacheConfig(cacheNames = "users")
public interface UserRepository extends JpaRepository&User, Long& {
@Cacheable
User findByName(String name);
再来执行以下单元测试,可以在控制台中输出了下面的内容:
Hibernate: insert into user (age, name) values (?, ?)
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?
第一次查询:10
第二次查询:10
到这里,我们可以看到,在调用第二次findByName函数时,没有再执行select语句,也就直接减少了一次数据库的读取操作。
为了可以更好的观察,缓存的存储,我们可以在单元测试中注入cacheManager。
@Autowired
private CacheManager cacheM
使用debug模式运行单元测试,观察cacheManager中的缓存集users以及其中的User对象的缓存加深理解。
Cache注解详解
回过头来我们再来看,这里使用到的两个注解分别作了什么事情。
@CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置。在这里@CacheConfig(cacheNames = "users"):配置了该数据访问对象中返回的内容将存储于名为users的缓存对象中,我们也可以不使用该注解,直接通过@Cacheable自己配置缓存集的名字来定义。
@Cacheable:配置了findByName函数的返回值将被加入缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问。该注解主要有下面几个参数:
value、cacheNames:两个等同的参数(cacheNames为Spring 4新增,作为value的别名),用于指定缓存存储的集合名。由于Spring 4中新增了@CacheConfig,因此在Spring 3中原本必须有的value属性,也成为非必需项了
key:缓存对象存储在Map集合中的key值,非必需,缺省按照函数的所有参数组合作为key值,若自己配置需使用SpEL表达式,比如:@Cacheable(key = "#p0"):使用函数第一个参数作为缓存的key值,更多关于SpEL表达式的详细内容可参考
condition:缓存对象的条件,非必需,也需使用SpEL表达式,只有满足表达式条件的内容才会被缓存,比如:@Cacheable(key = "#p0", condition = "#p0.length() & 3"),表示只有当第一个参数的长度小于3的时候才会被缓存,若做此配置上面的AAA用户就不会被缓存,读者可自行实验尝试。
unless:另外一个缓存条件参数,非必需,需使用SpEL表达式。它不同于condition参数的地方在于它的判断时机,该条件是在函数被调用之后才做判断的,所以它可以通过对result进行判断。
keyGenerator:用于指定key生成器,非必需。若需要指定一个自定义的key生成器,我们需要去实现org.springframework.cache.interceptor.KeyGenerator接口,并使用该参数来指定。需要注意的是:该参数与key是互斥的
cacheManager:用于指定使用哪个缓存管理器,非必需。只有当有多个时才需要使用
cacheResolver:用于指定使用那个缓存解析器,非必需。需通过org.springframework.cache.interceptor.CacheResolver接口来实现自己的缓存解析器,并用该参数指定。
除了这里用到的两个注解之外,还有下面几个核心注解:
@CachePut:配置于函数上,能够根据参数定义条件来进行缓存,它与@Cacheable不同的是,它每次都会真是调用函数,所以主要用于数据新增和修改操作上。它的参数与@Cacheable类似,具体功能可参考上面对@Cacheable参数的解析
@CacheEvict:配置于函数上,通常用在删除方法上,用来从缓存中移除相应数据。除了同@Cacheable一样的参数之外,它还有下面两个参数:
allEntries:非必需,默认为false。当为true时,会移除所有数据
beforeInvocation:非必需,默认为false,会在调用方法之后移除数据。当为true时,会在调用方法之前移除数据。
完成了上面的缓存实验之后,可能大家会问,那我们在Spring Boot中到底使用了什么缓存呢?
在Spring Boot中通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓存提供者:
JCache (JSR-107)
EhCache 2.x
Infinispan
除了按顺序侦测外,我们也可以通过配置属性spring.cache.type来强制指定。我们可以通过debug调试查看cacheManager对象的实例来判断当前使用了什么缓存。
本文中不对所有的缓存做详细介绍,下面以常用的EhCache为例,看看如何配置来使用EhCache进行缓存管理。
在Spring Boot中开启EhCache非常简单,只需要在工程中加入ehcache.xml配置文件并在pom.xml中增加ehcache依赖,框架只要发现该文件,就会创建EhCache的缓存管理器。
在src/main/resources目录下创建:ehcache.xml
&ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"&
&cache name="users"
maxEntriesLocalHeap="200"
timeToLiveSeconds="600"&
&/ehcache&
在pom.xml中加入
&dependency&
&groupId&net.sf.ehcache&/groupId&
&artifactId&ehcache&/artifactId&
&/dependency&
完成上面的配置之后,再通过debug模式运行单元测试,观察此时CacheManager已经是EhCacheManager实例,说明EhCache开启成功了。
对于EhCache的配置文件也可以通过application.properties文件中使用spring.cache.ehcache.config属性来指定,比如:
spring.cache.ehcache.config=classpath:config/another-config.xml
完整示例:
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
如果你是程序员,或者有一颗喜欢写程序的心,喜欢分享技术干货、项目经验、程序员日常囧事等等,欢迎投稿《程序员》专题。
专题主编:小...
· 194597人关注
玩转简书的第一步,从这个专题开始。
想上首页热门榜么?好内容想被更多人看到么?来投稿吧!如果被拒也不要灰心哦~入选文章会进一个队...
· 136026人关注
System.out.println(&Hello world!&);
· 1955人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 spring boot 打包 jar 的文章

 

随机推荐