天天看點

Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

注解開發

  • 1)注解驅動的意義
    • 1.1)什麼是注解驅動
    • 1.2)注解驅動的弊端
  • 2)常用注解
    • 2.1)啟動注解功能
    • 2.2)bean的定義
    • 2.3)bean的作用域
    • 2.4)bean的生命周期
    • 2.5)加載第三方資源
    • 2.6)bean的非引用類型屬性注入
    • 2.7)bean的引用類型屬性注入
    • 2.8)bean的引用類型屬性注入
    • 2.9)bean的引用類型屬性注入
    • 2.10)加載properties檔案
    • 2.11)純注解格式(重要)
    • 2.12)第三方bean配置與管理
  • 3)bean加載控制
    • 3.1)依賴加載
    • 3.2)依賴加載應用場景
    • 3.3小總結
  • 4)整合第三方技術
    • 4.1)綜合案例改版(注解整合MyBatis)
    • 4.2)注解整合MyBatis分析
    • 4.3)注解整合MyBatis步驟
  • 5)IoC底層核心原理
    • 5.1)IoC核心接口
    • 5.2)元件掃描器
    • 5.3)設定元件掃描加載過濾器
    • 5.4)自定義元件過濾器
    • 5.5)自定義導入器
    • 5.6)自定義注冊器
    • 5.7)bean初始化過程解析
    • 5.8)bean初始化過程解析
    • 5.9)bean初始化過程解析
    • 5.10)繁瑣的bean初始化過程處理
  • 6、兩種配置方式對比和了解
    • xml
    • 注解
    • 整合Mybatis核心xml和注解差别

1)注解驅動的意義

注解其實是一個标記

通過反射拿到一個類上或者一個方法上的注解是啥名,然後判斷這個注解是不是我們自己定義的注解,如果是就執行一些你的操作

Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

1.1)什麼是注解驅動

注解啟動時使用注解的形式替代xml配置,将繁雜的spring配置檔案從工程中徹底消除掉,簡化書寫

Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

1.2)注解驅動的弊端

  • 為了達成注解驅動的目的,可能會将原先很簡單的書寫,變的更加複雜
  • XML中配置第三方開發的資源是很友善的,但使用注解驅動無法在第三方開發的資源中進行編輯,是以會增大開發工作量

    -

    Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

2)常用注解

2.1)啟動注解功能

  • 啟動注解掃描,加載類中配置的注解項
  • Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

    注解

    @ComponentScan(“com.itheima”)

  • 說明:
    • 在進行包所掃描時,會對配置的包及其子包中所有檔案進行掃描
    • 掃描過程是以檔案夾遞歸疊代的形式進行的
    • 掃描過程僅讀取合法的java檔案
    • 掃描時僅讀取spring可識别的注解
    • 掃描結束後會将可識别的有效注解轉化為spring對應的資源加入IoC容器
  • 注意:
    • 無論是注解格式還是XML配置格式,最終都是将資源加載到IoC容器中,差别僅僅是資料讀取方式不同
    • 從加載效率上來說注解優于XML配置檔案

2.2)bean的定義

  • 名稱:@Component @Controller @Service @Repository
  • 類型:類注解
  • 位置:類定義上方
  • 作用:設定該類為spring管理的bean
  • 範例:
    @Component
    public class ClassName{}
               
  • 說明:
    • @Controller、@Service 、@Repository是@Component的衍生注解,功能同@Component
  • 相關屬性
    • value(預設):定義bean的通路id
      Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

2.3)bean的作用域

  • 名稱:@Scope
  • 類型:類注解
  • 位置:類定義上方
  • 作用:設定該類作為bean對應的scope屬性
  • 範例:
    @Scope
    public class ClassName{}
               
  • 相關屬性
    • value(預設):定義bean的作用域,預設為singleton
      Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

2.4)bean的生命周期

  • 名稱:@PostConstruct、@PreDestroy
  • 類型:方法注解
  • 位置:方法定義上方
  • 作用:設定該類作為bean對應的生命周期方法
  • 範例:
    @PostConstruct
    public void init() { System.out.println("init..."); }
               

2.5)加載第三方資源

  • 名稱:@Bean
  • 類型:方法注解
  • 位置:方法定義上方
  • 作用:設定該方法的傳回值作為spring管理的bean
    Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

2.6)bean的非引用類型屬性注入

  • 名稱:@Value
  • 類型:屬性注解、方法注解
  • 位置:屬性定義上方,方法定義上方
  • 作用:設定對應屬性的值或對方法進行傳參
  • 範例:
    @Value("${jdbc.username}")
    private String username;
               
  • 說明:
    • value值僅支援非引用類型資料,指派時對方法的所有參數全部指派
    • value值支援讀取properties檔案中的屬性值,通過類屬性将properties中資料傳入類中
    • value值支援SpEL
    • @value注解如果添加在屬性上方,可以省略set方法(set方法的目的是為屬性指派)
  • 相關屬性
    • value(預設):定義對應的屬性值或參數值

2.7)bean的引用類型屬性注入

  • 名稱:@Autowired、@Qualifier
  • 類型:屬性注解、方法注解
  • 位置:屬性定義上方,方法定義上方
  • 作用:設定對應屬性的對象或對方法進行引用類型傳參
  • 範例:
    @Autowired(required = false)
    @Qualifier("userDao")
    private UserDao userDao;
               
  • 說明:
    • @Autowired預設按類型裝配,指定@Qualifier後可以指定自動裝配的bean的id
  • 相關屬性
    • required:定義該屬性是否允許為null
      Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

2.8)bean的引用類型屬性注入

  • 名稱:@Primary
  • 類型:類注解
  • 位置:類定義上方
  • 作用:設定類對應的bean按類型裝配時優先裝配
  • 範例:
    @Primary
    public class ClassName{}
               
  • 說明:
    • @Autowired預設按類型裝配,當出現相同類型的bean,使用@Primary提高按類型自動裝配的優先級,多個@Primary會導緻優先級設定無效

2.9)bean的引用類型屬性注入

  • 名稱:@Inject、@Named、@Resource
  • 說明:
    • @Inject與@Named是JSR330規範中的注解,功能與@Autowired和@Qualifier完全相同,适用于不同架構場景
    • @Resource是JSR250規範中的注解,可以簡化書寫格式
  • @Resource相關屬性
    • name:設定注入的bean的id
    • type:設定注入的bean的類型,接收的參數為Class類型

2.10)加載properties檔案

  • 名稱:@PropertySource
  • 類型:類注解
  • 位置:類定義上方
  • 作用:加載properties檔案中的屬性值
  • 範例:
    @PropertySource(value = "classpath:filename.properties")
    public class ClassName {
        @Value("${propertiesAttributeName}")
        private String attributeName;
    }
               
    Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解
  • 說明:
    • 不支援*通配格式,一旦加載,所有spring控制的bean中均可使用對應屬性值
  • 相關屬性
    • value(預設):設定加載的properties檔案名
    • ignoreResourceNotFound:如果資源未找到,是否忽略,預設為false

2.11)純注解格式(重要)

  • 名稱:@Configuration、@ComponentScan
  • 類型:類注解
  • 位置:類定義上方
  • 作用:設定目前類為spring核心配置加載類
  • 範例:
    @Configuration
    @ComponentScan("scanPackageName")
    public class SpringConfigClassName{
    }
               
  • 說明:
    • 核心配合類用于替換spring核心配置檔案,此類可以設定空的,不設定變量與屬性
    • bean掃描工作使用注解@ComponentScan替代

AnnotationConfigApplicationContext

  • 加載純注解格式上下文對象,需要使用AnnotationConfigApplicationContext

2.12)第三方bean配置與管理

  • 名稱:@Import
  • 類型:類注解
  • 位置:類定義上方
  • 作用:導入第三方bean作為spring控制的資源
  • 範例:
    @Configuration
    @Import(OtherClassName.class)
    public class ClassName {
    }
               
  • 說明:
    • @Import注解在同一個類上,僅允許添加一次,如果需要導入多個,使用數組的形式進行設定
    • 在被導入的類中可以繼續使用@Import導入其他資源(了解)
    • @Bean所在的類可以使用導入的形式進入spring容器,無需聲明為bean

3)bean加載控制

3.1)依賴加載

(1)@DependsOn

  • 名稱:@DependsOn
  • 類型:類注解、方法注解
  • 位置:bean定義的位置(類上或方法上)
  • 作用:控制bean的加載順序,使其在指定bean加載完畢後再加載
  • 範例:
    @DependsOn("beanId")
    public class ClassName {
    }
               
  • 說明:
    • 配置在方法上,使@DependsOn指定的bean優先于@Bean配置的bean進行加載
    • 配置在類上,使@DependsOn指定的bean優先于目前類中所有@Bean配置的bean進行加載
    • 配置在類上,使@DependsOn指定的bean優先于@Component等配置的bean進行加載
  • 相關屬性
    • value(預設):設定目前bean所依賴的bean的id

(2)@Order

  • 名稱:@Order
  • 類型:配置類注解
  • 位置:配置類定義的位置(類上)
  • 作用:控制配置類的加載順序
  • 範例:
    @Order(1)
    public class SpringConfigClassName {
    }
               

(3)@Lazy

  • 名稱:@Lazy
  • 類型:類注解、方法注解
  • 位置:bean定義的位置(類上或方法上)
  • 作用:控制bean的加載時機,使其延遲加載
  • 範例:
    @Lazy
    public class ClassName {
    }
               
Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

3.2)依賴加載應用場景

@DependsOn

  • 微信訂閱号,釋出消息和訂閱消息的bean的加載順序控制
  • 雙11活動期間,零點前是結算政策A,零點後是結算政策B,政策B操作的資料為促銷資料。政策B加載順序與促銷資料的加載順序

@Lazy

  • 程式災難出現後對應的應急預案處理是啟動容器時加載時機

@Order

  • 多個種類的配置出現後,優先加載系統級的,然後加載業務級的,避免細粒度的加載控制

3.3小總結

Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解
Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解
Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解
Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解
Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

4)整合第三方技術

4.1)綜合案例改版(注解整合MyBatis)

Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

4.2)注解整合MyBatis分析

  • 業務類使用注解形式聲明bean,屬性采用注解注入
  • 建立獨立的配置管理類,分類管理外部資源,根據功能進行分類,并提供對應的方法擷取bean
  • 使用注解形式啟動bean掃描,加載所有注解配置的資源(bean)
  • 使用AnnotationConfigApplicationContext對象加載所有的啟動配置類,内部使用導入方式進行關聯

主配置檔案

@Configuration
@ComponentScan("com.itheima")//掃描包,加入容器
//外部檔案引入
@Import({DbConfig.class,MyBatisConfig.class})



public class SpringConfig {
}

           

子配置檔案Db

@PropertySource("classpath:jdbc.properties")
public class DbConfig {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean("dataSource")
    public DruidDataSource getDataSoure() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
    }
           

子配置檔案MyBatis

public class MyBatisConfig {

    @Bean
    public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource){
        //工廠拿對象
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setTypeAliasesPackage("com.itheima.domain");
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }




    @Bean
    public MapperScannerConfigurer getMapperScannerConfigurer(){
       //映射mapper
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.itheima.dao");
        return mapperScannerConfigurer;
    }
}

           

實作代碼

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
    StudentService bean = ctx.getBean(StudentService.class);
    List<Student> all = bean.findAll();
    for (Student student : all) {
        System.out.println(student);
    }
           

4.3)注解整合MyBatis步驟

1.修改mybatis外部配置檔案格式為注解格式

2.業務類使用@Component聲明bean,使用@Autowired注入對象

3.建立配置檔案JDBCConfig與MyBatisConfig類,并将其導入到核心配置類SpringConfig

4.開啟注解掃描

5.使用AnnotationConfigApplicationContext對象加載配置項

導入Spring整合Junit坐标

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.1.9.RELEASE</version>
</dependency>
           

Spring整合Junit測試用例注解格式

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {
}
           
@RunWith(SpringJUnit4ClassRunner.class)   //spring接管junit
@ContextConfiguration(classes = SpringConfig.class)  //加載容器
public class App {


    @Autowired
    private StudentService studentService;


    @Test
    public void xxx() {
        System.out.println(studentService.findAll());
    }
}
           
Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

5)IoC底層核心原理

5.1)IoC核心接口

Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解
Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

5.2)元件掃描器

  • 開發過程中,需要根據需求加載必要的bean,排除指定bean

    -

    Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

5.3)設定元件掃描加載過濾器

  • 名稱:@ComponentScan
  • 類型:類注解
  • 位置:類定義上方
  • 作用:設定spring配置加載類掃描規則
  • 範例:
    @ComponentScan(
        value="com.itheima",	           //設定基礎掃描路徑
        excludeFilters =                          //設定過濾規則,目前為排除過濾
    	@ComponentScan.Filter(            //設定過濾器
    	    type= FilterType.ANNOTATION,  //設定過濾方式為按照注解進行過濾
    	    classes=Repository.class)     //設定具體的過濾項,過濾所有@Repository修飾的bean
        )
               

​ includeFilters:設定包含性過濾器

​ excludeFilters:設定排除性過濾器

​ type:設定過濾器類型

Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解
Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

5.4)自定義元件過濾器

  • 名稱:TypeFilter
  • 類型:接口
  • 作用:自定義類型過濾器
  • 範例:
    public class MyTypeFilter implements TypeFilter {
        public boolean match(MetadataReader mr, MetadataReaderFactory mrf) throws IOException {
            ClassMetadata cm = metadataReader.getClassMetadata();
            tring className = cm.getClassName();
            if(className.equals("com.itheima.dao.impl.BookDaoImpl")){
                return false;
            }
            return false;
        }
    }
               

5.5)自定義導入器

  • bean隻有通過配置才可以進入spring容器,被spring加載并控制
  • 配置bean的方式如下:
    • XML檔案中使用标簽配置
    • 使用@Component及衍生注解配置
  • 企業開發過程中,通常需要配置大量的bean,需要一種快速高效配置大量bean的方式

ImportSelector

  • 名稱: ImportSelector
  • 類型:接口
  • 作用:自定義bean導入器
  • 範例:
    public class MyImportSelector implements ImportSelector {
        public String[] selectImports(AnnotationMetadata icm) {
            return new String[]{"com.itheima.dao.impl.AccountDaoImpl"};
        }
    }
               
    @Configuration
    @ComponentScan("com.itheima")
    @Import(MyImportSelector.class)
    public class SpringConfig {
    }
               
Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

5.6)自定義注冊器

  • 名稱:ImportBeanDefinitionRegistrar
  • 類型:接口
  • 作用:自定義bean定義注冊器
  • 範例:
    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
        public void registerBeanDefinitions(AnnotationMetadata icm, BeanDefinitionRegistry r) {
            ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(r, false);
            TypeFilter tf = new TypeFilter() {
                public boolean match(MetadataReader mr, MetadataReaderFactory mrf) throws IOException {
                    return true;
                }
            };
            scanner.addIncludeFilter(tf);
            //scanner.addExcludeFilter(tf);
            scanner.scan("com.itheima");
        }
    }
               

5.7)bean初始化過程解析

Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

5.8)bean初始化過程解析

  • BeanFactoryPostProcessor
    • 作用:定義了在bean工廠對象建立後,bean對象建立前執行的動作,用于對工廠進行建立後業務處理
    • 運作時機:目前操作用于對工廠進行處理,僅運作一次
  • BeanPostProcessor
    • 作用:定義了所有bean初始化前後進行的統一動作,用于對bean進行建立前業務處理與建立後業務處理
    • 運作時機:目前操作伴随着每個bean的建立過程,每次建立bean均運作該操作
  • InitializingBean
    • 作用:定義了每個bean的初始化前進行的動作,屬于非統一性動作,用于對bean進行建立前業務處理
    • 運作時機:目前操作伴随着任意一個bean的建立過程,保障其個性化業務處理
  • 注意:上述操作均需要被spring容器加載放可運作
Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解
Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

5.9)bean初始化過程解析

Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

5.10)繁瑣的bean初始化過程處理

  • FactoryBean
    • 對單一的bean的初始化過程進行封裝,達到簡化配置的目的

FactoryBean與BeanFactory差別

  • FactoryBean:封裝單個bean的建立過程
  • BeanFactory:Spring容器頂層接口,定義了bean相關的擷取操作

6、兩種配置方式對比和了解

IoC 控制反轉

控制對象Bean

反轉建立的方式 本來是new現在問容器拿

高内聚,低耦合

xml

所有的對象需要去xml導入容器中

标簽中

id唯一辨別,

class指定全類名(com.xxx.類名),

name起别名,

scope指定單例多例 (預設單例)

取出時

//2.加載配置檔案
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //3.擷取資源
        UserService userService = (UserService) ctx.getBean("userService");
        userService.save();
           

init-method 初始化

destroy-method 銷毀時

其實這兩個需要在标簽中指定才能用

Bean執行個體化三種方法

1.無參構造方法執行個體化

2.工廠靜态

3.工廠非靜态

<bean id="xxx" class="com.itheima.factory.InstanceFactory">
<bean id="studentService" factory-bean="xxx" factory-method="getAccountService">
           

Dl依賴注入,設定屬性

name:bean中屬性名,必須可通路的set方法

value:非引用類型的屬性值

ref:引用類型對應的bean的id

Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

集合類型

list,array,set 一類

map,props一類

加載指定的propertis檔案

使用加載的資料

import引入其他配置檔案

注解

給個辨別,簡化代碼

掃描

@ComponentScan(“com.itheima”)

遞歸掃描,需要有spring辨別,而且合法的配置包和及其子包

類注解

@Component

@Controller

@Service

@Repository

寫于類上,導入容器

@Scope

類上,單例多例

@PostConstruct

@PreDestroy

方法上,指定生命周期

@Bean

方法上,設定改方法的傳回值作為spring管理,多用于加載第三方資源

Spring-day02注解開發1)注解驅動的意義2)常用注解3)bean加載控制4)整合第三方技術5)IoC底層核心原理6、兩種配置方式對比和了解

@Value() 非引用屬性注入

屬性或者方法上,可以讀取properties檔案中的屬性值,如果添加在屬性上可以省略set方法(專門指派的方法)

@Value("${jdbc.username}")
private String username;
           

@Autowired

@Qualifier

屬性,方法上 引用類型屬性注入

上面一個預設按類型配,類型有多個按方法名配,有多個報錯

下面一個指定裝配的bean的id

@PropertySource

類上

@PropertySource(value = "classpath:filename.properties")
public class ClassName {
    @Value("${propertiesAttributeName}")
    private String attributeName;
}
           

不支援*通配格式,一旦加載,所有spring控制的bean中均可使用對應屬性值

重點,把類替換xml核心配置檔案

@Configuration //設定為核心配置檔案

@ComponentScan //掃描

類上

@Configuration
@ComponentScan("scanPackageName")
public class SpringConfigClassName{
}
           

然後就開始用AnnotationConfigApplicationContext對象建立了

@Import類上

要多個需要用數組形式導入

整合Mybatis核心xml和注解差别

xml

大體思路不變

  1. 引入外部檔案
  2. 配置連接配接池dataSoure對象
  3. 然後往SqlsessionFactoryBean裡放,同時給包起個别名
  4. 最後建立關系映射mapper一下
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">

    <context:property-placeholder location="classpath:*.properties"/>

   <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSoure">
       <property name="driverClassName" value="${jdbc.driver}"/>
       <property name="url" value="${jdbc.url}"/>
       <property name="username" value="${jdbc.username}"/>
       <property name="password" value="${jdbc.password}"/>
   </bean>


    <bean class="service.Impl.StudentServiceImpl" id="studentService">
        <property name="studentDao" ref="studentDao"/>
    </bean>

    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSoure"/>
        <property name="typeAliasesPackage" value="domain"/>
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="dao"/>
    </bean>
    
</beans>
           

調用的時候

ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("factory.xml");
        UserService fact1 = (UserService)classPathXmlApplicationContext.getBean("haha");
      
           

注解

@Configuration
@ComponentScan("com.itheima")//掃描包,加入容器
//外部檔案引入
@Import({DbConfig.class,MyBatisConfig.class})
public class SpringConfig {
}
           

在這個類中定義核心配置,然後掃描包,引入外部的資料庫連接配接池和建立工廠bean對象

如果要都寫一塊,記得把獲得MapperScannerConfigurer這個方法static,分開寫沒事

@PropertySource("classpath:jdbc.properties")
public class DbConfig {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean("dataSource")
    public DruidDataSource getDataSoure() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
           
@Bean
    public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource){
        //工廠拿對象
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setTypeAliasesPackage("com.itheima.domain");
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }




    @Bean
    public MapperScannerConfigurer getMapperScannerConfigurer(){
       //映射mapper
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.itheima.dao");
        return mapperScannerConfigurer;
    }
           

調用的時候

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
    StudentService bean = ctx.getBean(StudentService.class);