Spring多文件配置处理 通配符方式非web环境ApplicationContextctxnewClassPathXmlApplicationContext(applicationContext。xml);web环境contextparamparamnamecontextConfigLocationparamnameparamvalueclasspath:applicationContext。xmlparamvaluecontextparamimport标签applicationContext。xml整合其他配置内容importresourceapplicationContextdao。xmlimportresourceapplicationContextservice。xml。。。非web环境ApplicationContextctxnewClassPathXmlApplicationContext(applicationContext。xml);web环境contextparamparamnamecontextConfigLocationparamnameparamvalueclasspath:applicationContext。xmlparamvaluecontextparam接口的契约性 注解的契约性 Spring的基础注解 在Spring框架应用注解时,如果对注解配置的内容不满意,可以通过Spring配置文件进行覆盖。对象创建相关注解 》》》搭建开发环境!让Spring框架在设置包及其子包中扫描对应的注解,使其生效context:componentscanbasepackagecom。demo 》》》对象相关注解 1)Component:替换原有Spring配置文件中bean标签显示指定工厂创建对象的id值:Component(u); Spring配置文件覆盖注解配置内容: 2)Component的衍生注解以下三种注解能更加准确的表达一个类型的作用 Repository》XXXDAO Service》XXXService Controller 注意:本质上这些衍生注解就是Component,作用、细节、用法完全一致 Spring整合MyBatis开发过程中,不使用Repository、Component,原因是DAO的对象是动态代理创建的 3)Scope:控制简单对象创建次数 注意:不添加ScopeSpring提供默认值singleton 4)Lazy:延迟创建单实例对象 注意:使用Lazy注解后,Spring使用这个对象的时候,才会进行对象的创建 5)生命周期相关注解 注入相关注解 》》》Autowired用户自定义类型 Autowired基于类型进行注入:注入对象的类型,必须与目标成员变量类型相同或者是其子类(实现类)推荐 AutowiredQualifier基于名字进行注入 Autowired放置位置 a)放置在对应成员变量的set方法上 b)放置在成员变量之上,Spring通过反射直接对成员变量进行注入(赋值)推荐 JavaEE规范中类似功能的注解 JSR250Resource(nameuserDAOImpl)基于名字进行注入 Autowired() Qualifier(userDAOImpl) 注意:如果在应用Resource注解时,名字没有配对成功,那么会继续按照类型进行注入 JSR330Inject作用Autowired完全一致基于类型进行注入EJB3。0dependencygroupIdjavax。injectgroupIdjavax。injectartifactIdversion1versiondependency 》》》JDK类型 1)Value注解不能应用在静态成员变量上,否则赋值(注入)失败 该注解Properties这种方式,不能注入集合类型,YMALYML配置方式替代 2)PropertySource 注解扫描当前包及其子包context:componentscanbasepackagecom。demo 》》》排除方式 》》》包含方式 注解开发的思考 》》》配置互通 》》》注解和配置文件使用的条件程序员自己开发的类型,可以加入对应的注解,进行对象创建。 非程序员开发的类型,需要配置文件(bean标签来完成)进行配置。(如:SqlSessionFactoryBean、MapperScannerConfigure)SSM半注解DAO(SpringMyBatis) Service ControllerSpring的高级注解配置Bean Configuration实际上是Component的衍生注解 》》》配置日志 基于注解开发,不能集成log4j,发现没有日志打印 基于注解开发,集成的是logback!引入logback相关依赖dependencygroupIdorg。slf4jgroupIdslf4japiartifactIdversion1。7。25versiondependencydependencygroupIdorg。slf4jgroupIdjcloverslf4jartifactIdversion1。7。25versiondependencydependencygroupIdch。qos。logbackgroupIdlogbackclassicartifactIdversion1。2。3versiondependencydependencygroupIdch。qos。logbackgroupIdlogbackcoreartifactIdversion1。2。3versiondependencydependencygroupIdorg。logbackextensionsgroupIdlogbackextspringartifactIdversion0。1。4versiondependency!resources目录下创建logback。xml配置文件lt;?xmlversion1。0encodingUTF8?configurationencoder!格式化输出:d:日期thread:线程名5level:级别从左显示5个字符宽度msg:日志消息n:换行符patternd{yyyyMMddHH:mm:ss。SSS}〔thread〕5levellogger{50}msgnpatternencoderappenderrootlevelDEBUGrootconfigurationAnnotationConfigApplicationContext Bean注解 等同于XML配置文件中bean标签 》》》对象的创建简单对象:直接通过new方式创建的对象 复杂对象:不能通过new方式创建的对象(如:Connection,SqlSessionFactory) packagecom。demo;importcom。demo。bean。User;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。Configuration;importjava。sql。Connection;importjava。sql。DriverManager;importjava。sql。SQLException;ConfigurationpublicclassAppConfig{简单对象returnBeanpublicUseruser(){returnnewUser();}复杂对象(推荐使用)Connection不能直接通过new创建returnBeanpublicConnectionconn(){Connectionconnnull;try{Class。forName(com。mysql。cj。jdbc。Driver);connDriverManager。getConnection(jdbc:mysql:192。168。XXX。222:3306ssmdb?useSSLfalse,root,root);}catch(ClassNotFoundExceptione){e。printStackTrace();}catch(SQLExceptionthrowables){throwables。printStackTrace();}returnconn;}}packagecom。demo。bean;importorg。springframework。beans。factory。FactoryBean;importjava。sql。Connection;importjava。sql。DriverManager;publicclassConnectionFactoryBeanimplementsFactoryBeanConnection{OverridepublicConnectiongetObject()throwsException{Class。forName(com。mysql。cj。jdbc。Driver);ConnectionconnDriverManager。getConnection(jdbc:mysql:192。168。XXX。222:3306ssmdb?useSSLfalse,root,root);returnconn;}OverridepublicClasslt;?getObjectType(){returnConnection。class;}OverridepublicbooleanisSingleton(){returnfalse;}}遗留系统使用该方式创建很少自己写ConnectionFactoryBean,来创建复杂对象returnBeanpublicConnectionconn(){Connectionconnnull;try{ConnectionFactoryBeanfactoryBeannewConnectionFactoryBean();connfactoryBean。getObject();}catch(Exceptione){e。printStackTrace();}returnconn;} 》》》自定义id值 Bean(id) 》》》控制对象创建次数Bean Scope(singletonprototype)默认值singletonBean注解的注入 》》》用户自定义注入packagecom。demo;importcom。demo。injection。UserDAO;importcom。demo。injection。UserDAOImpl;importcom。demo。injection。UserService;importcom。demo。injection。UserServiceImpl;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。Configuration;ConfigurationpublicclassAppConfig{BeanpublicUserDAOuserDAO(){returnnewUserDAOImpl();}BeanpublicUserServiceuserService(UserDAOuserDAO){UserServiceImpluserServicenewUserServiceImpl();userService。setUserDAO(userDAO);returnuserService;}}packagecom。demo;importcom。demo。injection。UserDAO;importcom。demo。injection。UserDAOImpl;importcom。demo。injection。UserService;importcom。demo。injection。UserServiceImpl;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。Configuration;ConfigurationpublicclassAppConfig{BeanpublicUserDAOuserDAO(){returnnewUserDAOImpl();}简化写法(没有把userDAO作为形参传入)BeanpublicUserServiceuserService(){UserServiceImpluserServicenewUserServiceImpl();userService。setUserDAO(userDAO());returnuserService;}} 》》》JDK类型注入BeanpublicCustomercustomer(){CustomercustomernewCustomer();硬代码耦合customer。setId(1);customer。setName(zhangsan);returncustomer;}packagecom。demo;importcom。demo。bean。Customer;importorg。springframework。beans。factory。annotation。Value;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。Configuration;importorg。springframework。context。annotation。PropertySource;读取配置文件init。properties,解决耦合问题ConfigurationPropertySource(classpath:init。properties)publicclassAppConfig{Value({id})privateIntegerid;Value({name})privateStringname;BeanpublicCustomercustomer(){CustomercustomernewCustomer();customer。setId(id);customer。setName(name);returncustomer;}}ComponentScan注解ComponentScan等同于XML配置文件中的标签 目的:扫描注解(如:Component、Value、Autowired。。。) 》》》排除、包含的使用 1)排除 2)包含 Spring多种配置方式 》》》配置优先级配置文件bean标签BeanComponent及其衍生注解 优先级高的配置覆盖优先级低的配置 配置的优先级能解决耦合问题 ApplicationContextctxnewAnnotationConfigApplicationContext(AppConfig4。class,AppConfig5。class);ApplicationContextctxnewAnnotationConfigApplicationContext(com。demo。config);多个配置信息 》》》多配置信息整合 多个配置Bean的整合 1)basepackage进行多个配置Bean的整合 2)Import 1。可以创建对象 2。多配置bean的整合 3)指定多个配置Bean的Class对象ApplicationContextctxnewAnnotationConfigApplicationContext(AppConfig1。class,AppConfig2。class,。。。); 配置Bean与Component相关注解的整合 配置Bean与SpringXML配置文件的整合 跨配置的注入 配置Bean底层实现原理 Spring在配置Bean中加入了Configuration注解后,底层就会通过CGlib的代理方式,来进行对象相关的配置、处理四维一体的开发思想 基于schema 基于特定功能注解推荐 基于原始beanbeannameclassorg。springframework。context。support。PropertySourcesPlaceholderConfigurerpropertynamelocationvalueclasspath:init。propertiesbean 基于Bean注解推荐packagecom。demo;importorg。springframework。context。annotation。;importorg。springframework。context。support。PropertySourcesPlaceholderConfigurer;importorg。springframework。core。io。ClassPathResource;ConfigurationComponentScan(basePackagescom。demo)publicclassAppConfig{BeanpublicPropertySourcesPlaceholderConfigurerconfigurer(){PropertySourcesPlaceholderConfigurerconfigurernewPropertySourcesPlaceholderConfigurer();configurer。setLocation(newClassPathResource(init。properties));returnconfigurer;}}纯注解版AOP编程 packagecom。demo。aop;publicinterfaceUserService{voidregister();voidlogin();}packagecom。demo。aop;importorg。springframework。stereotype。Service;ServicepublicclassUserServiceImplimplementsUserService{Overridepublicvoidregister(){System。out。println(UserServiceImpl。register);}Overridepublicvoidlogin(){System。out。println(UserServiceImpl。login);}}packagecom。demo。aop;importorg。aspectj。lang。ProceedingJoinPoint;importorg。aspectj。lang。annotation。Around;importorg。aspectj。lang。annotation。Aspect;importorg。aspectj。lang。annotation。Pointcut;importorg。springframework。stereotype。Component;AspectComponentpublicclassMyAspect{Pointcut(execution(com。demo。aop。。。(。。)))publicvoidpointCut(){}Around(pointCut())publicObjectarroud(ProceedingJoinPointjoinPoint)throwsThrowable{System。out。println(Log);ObjectproceedjoinPoint。proceed();returnproceed;}}packagecom。demo。aop;importorg。springframework。context。annotation。ComponentScan;importorg。springframework。context。annotation。Configuration;importorg。springframework。context。annotation。EnableAspectJAutoProxy;ConfigurationComponentScan(basePackagescom。demo。aop)EnableAspectJAutoProxypublicclassAOPConfig{} 》》》注解AOP细节分析SpringAOP代理默认:JDK SpringBootAOP代理默认:CGlib 纯注解版SpringMyBatis整合基础配置(配置Bean) packagecom。demo。mybatis;importcom。alibaba。druid。pool。DruidDataSource;importorg。mybatis。spring。SqlSessionFactoryBean;importorg。mybatis。spring。annotation。MapperScan;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。ComponentScan;importorg。springframework。context。annotation。Configuration;importorg。springframework。core。io。Resource;importorg。springframework。core。io。support。PathMatchingResourcePatternResolver;importorg。springframework。core。io。support。ResourcePatternResolver;importjavax。sql。DataSource;importjava。io。IOException;ConfigurationComponentScan(basePackagescom。demo。mybatis)MapperScan(basePackagescom。demo。mybatis)publicclassMyBatisAutoConfiguration{BeanpublicDataSourcedataSource(){DruidDataSourcedataSourcenewDruidDataSource();dataSource。setDriverClassName(com。mysql。cj。jdbc。Driver);dataSource。setUrl(jdbc:mysql:192。168。30。222:3306ssmdb);dataSource。setUsername(root);dataSource。setPassword(root);returndataSource;}BeanpublicSqlSessionFactoryBeansqlSessionFactoryBean(DataSourcedataSource){SqlSessionFactoryBeansqlSessionFactoryBeannewSqlSessionFactoryBean();sqlSessionFactoryBean。setDataSource(dataSource);sqlSessionFactoryBean。setTypeAliasesPackage(com。demo。mybatis);sqlSessionFactoryBean。setMapperLocations(newClassPathResource(UserDAOMapper。xml));try{ResourcePatternResolverresolvernewPathMatchingResourcePatternResolver();Resource〔〕resourcesresolver。getResources(comdemomapperMapper。xml);sqlSessionFactoryBean。setMapperLocations(resources);}catch(IOExceptione){e。printStackTrace();}returnsqlSessionFactoryBean;}}配置Bean耦合问题mybatis。driverClassNamecom。mysql。cj。jdbc。Drivermybatis。urljdbc:mysql:192。168。XXX。222:3306ssmdbmybatis。usernamerootmybatis。passwordrootmybatis。typeAliasesPackagescom。demo。mybatismybatis。mapperLocationscomdemomapperMapper。xmlpackagecom。demo。mybatis;importlombok。Data;importorg。springframework。beans。factory。annotation。Value;importorg。springframework。context。annotation。PropertySource;importorg。springframework。stereotype。Component;DataComponentPropertySource(classpath:mybatis。properties)publicclassMybatisProperties{Value({mybatis。driverClassName})privateStringdriverClassName;Value({mybatis。url})privateStringurl;Value({mybatis。username})privateStringusername;Value({mybatis。password})privateStringpassword;Value({mybatis。typeAliasesPackages})privateStringtypeAliasesPackages;Value({mybatis。mapperLocations})privateStringmapperLocations;}packagecom。demo。mybatis;importcom。alibaba。druid。pool。DruidDataSource;importorg。mybatis。spring。SqlSessionFactoryBean;importorg。mybatis。spring。annotation。MapperScan;importorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。ComponentScan;importorg。springframework。context。annotation。Configuration;importorg。springframework。core。io。Resource;importorg。springframework。core。io。support。PathMatchingResourcePatternResolver;importorg。springframework。core。io。support。ResourcePatternResolver;importjavax。sql。DataSource;importjava。io。IOException;ConfigurationComponentScan(basePackagescom。demo。mybatis)MapperScan(basePackagescom。demo。mybatis)publicclassMyBatisAutoConfiguration{AutowiredprivateMybatisPropertiesmybatisProperties;BeanpublicDataSourcedataSource(){DruidDataSourcedataSourcenewDruidDataSource();dataSource。setDriverClassName(mybatisProperties。getDriverClassName());dataSource。setUrl(mybatisProperties。getUrl());dataSource。setUsername(mybatisProperties。getUsername());dataSource。setPassword(mybatisProperties。getPassword());returndataSource;}BeanpublicSqlSessionFactoryBeansqlSessionFactoryBean(DataSourcedataSource){SqlSessionFactoryBeansqlSessionFactoryBeannewSqlSessionFactoryBean();sqlSessionFactoryBean。setDataSource(dataSource);sqlSessionFactoryBean。setTypeAliasesPackage(mybatisProperties。getTypeAliasesPackages());sqlSessionFactoryBean。setMapperLocations(newClassPathResource(UserDAOMapper。xml));try{ResourcePatternResolverresolvernewPathMatchingResourcePatternResolver();Resource〔〕resourcesresolver。getResources(mybatisProperties。getMapperLocations());sqlSessionFactoryBean。setMapperLocations(resources);}catch(IOExceptione){e。printStackTrace();}returnsqlSessionFactoryBean;}}纯注解版事务编程 packagecom。demo。mybatis;publicinterfaceUserService{voidregister(Useruser);}packagecom。demo。mybatis;importlombok。Data;importorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。stereotype。Service;importorg。springframework。transaction。annotation。Transactional;DataServiceTransactionalpublicclassUserServiceImplimplementsUserService{AutowiredprivateUserDAOuserDAO;Overridepublicvoidregister(Useruser){userDAO。save(user);}}packagecom。demo。mybatis;importorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。Configuration;importorg。springframework。jdbc。datasource。DataSourceTransactionManager;importorg。springframework。transaction。annotation。EnableTransactionManagement;importjavax。sql。DataSource;ConfigurationEnableTransactionManagementpublicclassTransactionAutoConfiguration{AutowiredprivateDataSourcedataSource;BeanpublicDataSourceTransactionManagerdataSourceTransactionManager(){DataSourceTransactionManagerdataSourceTransactionManagernewDataSourceTransactionManager();dataSourceTransactionManager。setDataSource(dataSource);returndataSourceTransactionManager;}}Spring中YAMLYML使用 YML语法 Spring与YML集成 dependencygroupIdorg。yamlgroupIdsnakeyamlartifactIdversion2。0versiondependency 》》》init。ymlaccount:name:zhangsanpassword:rootpackagecom。demo。yml;importlombok。Data;importorg。springframework。beans。factory。annotation。Value;importorg。springframework。stereotype。Component;DataComponentpublicclassAccount{Value({account。name)privateStringname;Value({account。password})privateStringpassword;}packagecom。demo。yml;importorg。springframework。beans。factory。config。YamlPropertiesFactoryBean;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。ComponentScan;importorg。springframework。context。annotation。Configuration;importorg。springframework。context。support。PropertySourcesPlaceholderConfigurer;importorg。springframework。core。io。ClassPathResource;importjava。util。Properties;ConfigurationComponentScan(basePackagescom。demo。yml)publicclassYmlAutoConfiguration{BeanpublicPropertySourcesPlaceholderConfigurerconfigurer(){YamlPropertiesFactoryBeanyamlPropertiesFactoryBeannewYamlPropertiesFactoryBean();yamlPropertiesFactoryBean。setResources(newClassPathResource(init。yml));PropertiespropertiesyamlPropertiesFactoryBean。getObject();PropertySourcesPlaceholderConfigurerconfigurernewPropertySourcesPlaceholderConfigurer();configurer。setProperties(properties);returnconfigurer;}}Spring与YML集成问题 》》》init。ymlaccount:name:zhangsanpassword:rootlist:111,222packagecom。demo。yml;importlombok。Data;importorg。springframework。beans。factory。annotation。Value;importorg。springframework。stereotype。Component;importjava。util。List;DataComponentpublicclassAccount{Value({account。name)privateStringname;Value({account。password})privateStringpassword;Value({{list}。split(,)})privateListStringlist;}