@Configuration:

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

注意:@Configuration注解的配置类有如下要求:

  1. @Configuration不可以是final类型;
  2. @Configuration不可以是匿名类;
  3. 嵌套的configuration必须是静态类。

@Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。

2、@EnableAutoConfiguration:能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。

3、@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。

 

原文地址:https://blog.csdn.net/u013473691/article/details/52353923

 

@EnableJpaRepositories:

@EnableJpaRepositories注解用于Srping JPA的代码配置,用于取代xml形式的配置文件,@EnableJpaRepositories支持的配置形式丰富多用,本篇文章详细讲解。

1、简单配置


@EnableJpaRepositories("com.spr.repository")

简单配置支持多个package,格式如下:


@EnableJpaRepositories({"com.cshtong.sample.repository", "com.cshtong.tower.repository"})

2、单值和多组值配置方式

大部分注解可以都支持单个注解方式和多个注解,多个注解通常采用"{}"符号包含的一组数据。

比如:字符串形式的  "x.y.z"  =>  {"x.y.z","a.b.c"}

类别: A.class => {A.class, B.class}

3、完整的@EnableJpaRepositories注解


@EnableJpaRepositories(
     basePackages = {},
     basePackageClasses = {},
     includeFilters = {},
     excludeFilters = {},
     repositoryImplementationPostfix = "Impl",
     namedQueriesLocation = ""//META-INF/jpa-named-queries.properties
     queryLookupStrategy=QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND, //QueryLookupStrategy.Key.x
     repositoryFactoryBeanClass=JpaRepositoryFactoryBean.class//class
     entityManagerFactoryRef="entityManagerFactory",
     transactionManagerRef="transactionManager",
     considerNestedRepositories=false, 
     enableDefaultTransactions=true
 )

下面分别解释各个配置项的作用

1)basePackage

用于配置扫描Repositories所在的package及子package。简单配置中的配置则等同于此项配置值,basePackages可以配置为单个字符串,也可以配置为字符串数组形式。


@EnableJpaRepositories(
       basePackages = "com.cshtong")

多个包路径


@EnableJpaRepositories(
        basePackages = {"com.cshtong.sample.repository", "com.cshtong.tower.repository"}

2)basePackageClasses

指定 Repository 类


@EnableJpaRepositories(basePackageClasses = BookRepository.class)

@EnableJpaRepositories(
        basePackageClasses = {ShopRepository.classOrganizationRepository.class})

备注:测试的时候发现,配置包类的一个Repositories类,该包内其他Repositores也会被加载

3)includeFilters

过滤器,该过滤区采用ComponentScan的过滤器类


@EnableJpaRepositories(
        includeFilters={@ComponentScan.Filter(type=FilterType.ANNOTATION, 
        value=Repository.class)}

4)excludeFilters

不包含过滤器


@EnableJpaRepositories(
        excludeFilters={
        @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Service.class),
        @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Controller.class)})

5)repositoryImplementationPostfix

实现类追加的尾部,比如ShopRepository,对应的为ShopRepositoryImpl

6)namedQueriesLocation

named SQL存放的位置,默认为META-INF/jpa-named-queries.properties

7)queryLookupStrategy

构建条件查询的策略,包含三种方式CREATE,USE_DECLARED_QUERY,CREATE_IF_NOT_FOUND

  • CREATE:按照接口名称自动构建查询

  • USE_DECLARED_QUERY:用户声明查询

  • CREATE_IF_NOT_FOUND:先搜索用户声明的,不存在则自动构建

该策略针对如下通过接口名称自动生成查询的场景


  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);  
  
  // Enables the distinct flag for the query
  List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List<Person> findPeopleDistinctBLastnameOrFirstname(String lastname, String firstname);  
  
  // Enabling ignoring case for an individual property
  List<Person> findByLastnameIgnoreCase(String lastname);  
  // Enabling ignoring case for all suitable properties
  List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);  
  
  // Enabling static ORDER BY for a query
  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
  List<Person> findByLastnameOrderByFirstnameDesc(String lastname)

8)repositoryFactoryBeanClass

指定Repository的工厂类

9)entityManagerFactoryRef

实体管理工厂引用名称,对应到@Bean注解对应的方法


@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = 
                         new LocalContainerEntityManagerFactoryBean();
    entityManagerFactoryBean.setDataSource(dataSource());
    entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
    entityManagerFactoryBean.setPackagesToScan(
                 env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
    entityManagerFactoryBean.setJpaProperties(hibProperties());
    return entityManagerFactoryBean;
}

10)transactionManagerRef

事务管理工厂引用名称,对应到@Bean注解对应的方法


@Bean
public JpaTransactionManager transactionManager() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
    return transactionManager;
}

原文地址:https://my.oschina.net/sasky/blog/527678

我的项目中的配置是这样的:

package com.course.customer;

import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

import com.course.common.orm.MyJpaRepositoryFactoryBean;

@Configuration
@EntityScan({ "com.course.customer.domain" })
@EnableJpaRepositories(basePackages = {
        "com.course.customer.repository" }, repositoryFactoryBeanClass = MyJpaRepositoryFactoryBean.class)
@ComponentScan({ "com.course.customer.service.impl"})
public class ContextConfig {


}

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐