手机网站 html5,上海网站开发怎么做,装修案例介绍文案,食品销售公司网站制作一、Spring注解开发
1 注解开发定义Bean对象【重点】 目的#xff1a;xml配置Bean对象有些繁琐#xff0c;使用注解简化Bean对象的定义 问题导入
问题1#xff1a;使用什么标签进行Spring注解包扫描#xff1f;
问题2#xff1a;Component注解和Controller、Service、R…一、Spring注解开发
1 注解开发定义Bean对象【重点】 目的xml配置Bean对象有些繁琐使用注解简化Bean对象的定义 问题导入
问题1使用什么标签进行Spring注解包扫描
问题2Component注解和Controller、Service、Repository三个衍生注解有什么区别
1.1 基本使用
【第一步】在applicationContext.xml中开启Spring注解包扫描
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:contexthttp://www.springframework.org/schema/contextxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd!--扫描com.itheima包及其子包下的类中注解--context:component-scan base-packagecom.itheima/
/beans【第二步】在类上使用Component注解定义Bean。
//Component定义bean
Component(bookDao)
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ...);}
}
Component
public class BookServiceImpl implements BookService {private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao bookDao;}public void save() {System.out.println(book service save ...);bookDao.save();}
}补充说明如果Component注解没有使用参数指定Bean的名称那么类名首字母小写就是Bean在IOC容器中的默认名称。例如BookServiceImpl对象在IOC容器中的名称是bookServiceImpl。 【第三步】在测试类中获取Bean对象
public class AppForAnnotation {public static void main(String[] args) {ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);BookDao bookDao (BookDao) ctx.getBean(bookDao);System.out.println(bookDao);//按类型获取beanBookService bookService ctx.getBean(BookService.class);System.out.println(bookService);}
}注意在测试类中不要调用bookService的save方法因为还没有给BookServiceImpl中的bookDao赋值调用bookService的save方法会出现空指针异常。 运行结果 1.2 Component三个衍生注解 说明加粗的注解为常用注解 Spring提供**Component**注解的三个衍生注解 Controller用于表现层bean定义Service用于业务层bean定义Repository用于数据层bean定义
Repository(bookDao)
public class BookDaoImpl implements BookDao {
}Service
public class BookServiceImpl implements BookService {
}
2 纯注解开发模式【重点】
问题导入
问题1配置类上使用什么注解表示该类是一个配置类
问题2配置类上使用什么注解进行Spring注解包扫描
2.1 纯注解开发模式介绍
Spring3.0开启了纯注解开发模式使用Java类替代配置文件开启了Spring快速开发赛道Java类代替Spring核心配置文件 Configuration注解用于设定当前类为配置类ComponentScan注解用于设定扫描路径此注解只能添加一次多个数据请用数组格式
ComponentScan({com.itheima.service,com.itheima.dao})读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象
//加载配置文件初始化容器
ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);
//加载配置类初始化容器
ApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);2.2 代码演示
【第一步】定义配置类代替配置文件
//声明当前类为Spring配置类
Configuration
//Spring注解扫描相当于context:component-scan base-packagecom.itheima/
ComponentScan(com.itheima)
//设置bean扫描路径多个路径书写为字符串数组格式
//ComponentScan({com.itheima.service,com.itheima.dao})
public class SpringConfig {
}【第二步】在测试类中加载配置类获取Bean对象并使用
public class AppForAnnotation {public static void main(String[] args) {//AnnotationConfigApplicationContext加载Spring配置类初始化Spring容器ApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao (BookDao) ctx.getBean(bookDao);System.out.println(bookDao);//按类型获取beanBookService bookService ctx.getBean(BookService.class);System.out.println(bookService);}
}3 注解开发Bean作用范围和生命周期管理
问题导入
在类上使用什么注解定义Bean的作用范围
3.1 bean作用范围注解配置
使用Scope定义bean作用范围
Repository
Scope(singleton)
public class BookDaoImpl implements BookDao {
}3.2 bean生命周期注解配置
使用PostConstruct、PreDestroy定义bean生命周期
Repository
Scope(singleton)
public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println(book dao constructor ...);}PostConstructpublic void init(){System.out.println(book init ...);}PreDestroypublic void destroy(){System.out.println(book destory ...);}
}注意PostConstruct和PreDestroy注解是jdk中提供的注解从jdk9开始jdk中的javax.annotation包被移除了也就是说这两个注解就用不了了可以额外导入一下依赖解决这个问题。
dependencygroupIdjavax.annotation/groupIdartifactIdjavax.annotation-api/artifactIdversion1.3.2/version
/dependency4 注解开发依赖注入【重点】
问题导入
问题1请描述Autowired注解是如何进行自动装配的
问题2请描述Qualifier注解的作用
4.1 使用Autowired注解开启自动装配模式按类型
Service
public class BookServiceImpl implements BookService {//Autowired注入引用类型自动装配模式默认按类型装配Autowiredprivate BookDao bookDao;public void save() {System.out.println(book service save ...);bookDao.save();}
}说明不管是使用配置文件还是配置类都必须进行对应的Spring注解包扫描才可以使用。Autowired默认按照类型自动装配如果IOC容器中同类的Bean有多个那么默认按照变量名和Bean的名称匹配建议使用Qualifier注解指定要装配的bean名称 注意自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据因此无需提供setter方法。
4.2 使用Qualifier注解指定要装配的bean名称 目的解决IOC容器中同类型Bean有多个装配哪一个的问题 Service
public class BookServiceImpl implements BookService {//Autowired注入引用类型自动装配模式默认按类型装配Autowired//Qualifier自动装配bean时按bean名称装配Qualifier(bookDao)private BookDao bookDao;public void save() {System.out.println(book service save ...);bookDao.save();}
}注意Qualifier注解无法单独使用必须配合Autowired注解使用
4.3 使用Value实现简单类型注入
Repository(bookDao)
public class BookDaoImpl implements BookDao {//Value注入简单类型无需提供set方法Value(${name})private String name;public void save() {System.out.println(book dao save ... name);}
}以上Value注解中使用${name}从属性文件中读取name值那么就需要在配置类或者配置文件中加载属性文件。
Configuration
ComponentScan(com.itheima)
//PropertySource加载properties配置文件
PropertySource({classpath:jdbc.properties}) //{}可以省略不写
public class SpringConfig {
}注意PropertySource()中加载多文件请使用数组格式配置不允许使用通配符*
5 注解开发管理第三方Bean【重点】
问题导入
导入自己定义的配置类有几种方式
【第一步】单独定义配置类
public class JdbcConfig {//Bean表示当前方法的返回值是一个bean对象添加到IOC容器中Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;}
}【第二步】将独立的配置类加入核心配置
方式1Import注解导入式
Configuration
ComponentScan(com.itheima)
//Import:导入配置信息
Import({JdbcConfig.class})
public class SpringConfig {
}方式2ComponentScan扫描式
Configuration
ComponentScan({com.itheima.config,com.itheima.service,com.itheima.dao}) //只要com.itheima.config包扫到了就行三个包可以合并写成com.itheima
public class SpringConfig {
}6 注解开发为第三方Bean注入资源【重点】
问题导入
配置类中如何注入简单类型数据如何注入引用类型数据
6.1 简单类型依赖注入
public class JdbcConfig {//1.定义一个方法获得要管理的对象Value(com.mysql.jdbc.Driver)private String driver;Value(jdbc:mysql://localhost:3306/spring_db)private String url;Value(root)private String userName;Value(root)private String password;//2.Bean表示当前方法的返回值是一个bean对象添加到IOC容器中Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}
}说明如果Value()中使用了EL表达式读取properties属性文件中的内容那么就需要加载properties属性文件。 6.2 引用类型依赖注入
//Spring会自动从IOC容器中找到BookDao对象赋值给参数bookDao变量如果没有就会报错。
Bean
public DataSource dataSource(BookDao bookDao){System.out.println(bookDao);DruidDataSource ds new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;
}说明引用类型注入只需要为bean定义方法设置形参即可容器会根据类型自动装配对象 7 注解开发总结 二、Spring整合其他技术【重点】
1 Spring整合mybatis【重点】
1.1 思路分析
问题导入
mybatis进行数据层操作的核心对象是谁
1.1.1 MyBatis程序核心对象分析 1.1.2 整合MyBatis
使用SqlSessionFactoryBean封装SqlSessionFactory需要的环境信息 使用MapperScannerConfigurer加载Dao接口创建代理对象保存到IOC容器中 1.2 代码实现
问题导入
问题1Spring整合mybatis的依赖叫什么
问题2Spring整合mybatis需要管理配置哪两个Bean这两个Bean作用分别是什么
【前置工作】
在pom.xml中添加spring-context、druid、mybatis、mysql-connector-java等基础依赖。准备service和dao层基础代码
public interface AccountService {void save(Account account);void delete(Integer id);void update(Account account);ListAccount findAll();Account findById(Integer id);}
Service
public class AccountServiceImpl implements AccountService {Autowiredprivate AccountDao accountDao;public void save(Account account) {accountDao.save(account);}public void update(Account account){accountDao.update(account);}public void delete(Integer id) {accountDao.delete(id);}public Account findById(Integer id) {return accountDao.findById(id);}public ListAccount findAll() {return accountDao.findAll();}
}
public interface AccountDao {Insert(insert into tbl_account(name,money)values(#{name},#{money}))void save(Account account);Delete(delete from tbl_account where id #{id} )void delete(Integer id);Update(update tbl_account set name #{name} , money #{money} where id #{id} )void update(Account account);Select(select * from tbl_account)ListAccount findAll();Select(select * from tbl_account where id #{id} )Account findById(Integer id);
}【第一步】导入Spring整合Mybatis依赖
dependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.2.10.RELEASE/version
/dependencydependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion1.3.0/version
/dependency【第二步】创建JdbcConfig配置DataSource数据源
jdbc.drivercom.mysql.jdbc.Driver
jdbc.urljdbc:mysql://localhost:3306/spring_db?useSSLfalse
jdbc.usernameroot
jdbc.passwordrootpublic class JdbcConfig {Value(${jdbc.driver})private String driver;Value(${jdbc.url})private String url;Value(${jdbc.username})private String userName;Value(${jdbc.password})private String password;Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}
}【第三步】创建MybatisConfig整合mybatis
public class MybatisConfig {//定义beanSqlSessionFactoryBean用于产生SqlSessionFactory对象Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){SqlSessionFactoryBean ssfb new SqlSessionFactoryBean();ssfb.setTypeAliasesPackage(com.itheima.domain);ssfb.setDataSource(dataSource);return ssfb;}//定义bean返回MapperScannerConfigurer对象Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc new MapperScannerConfigurer();msc.setBasePackage(com.itheima.dao);return msc;}
}【第四步】创建SpringConfig主配置类进行包扫描和加载其他配置类
Configuration
ComponentScan(com.itheima)
//PropertySource加载类路径jdbc.properties文件
PropertySource(classpath:jdbc.properties)
Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {
}【第五步】定义测试类进行测试
public class App {public static void main(String[] args) {ApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);AccountService accountService ctx.getBean(AccountService.class);Account ac accountService.findById(1);System.out.println(ac);}
}2 Spring整合Junit单元测试【重点】
问题导入
Spring整合Junit的两个注解作用分别是什么
【第一步】导入整合的依赖坐标spring-test
!--junit--
dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version
/dependency
!--spring整合junit--
dependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion5.1.9.RELEASE/version
/dependency【第二步】使用Spring整合Junit专用的类加载器
【第三步】加载配置文件或者配置类
//【第二步】使用Spring整合Junit专用的类加载器
RunWith(SpringJUnit4ClassRunner.class)
//【第三步】加载配置文件或者配置类
ContextConfiguration(classes {SpringConfiguration.class}) //加载配置类
//ContextConfiguration(locations{classpath:applicationContext.xml})//加载配置文件
public class AccountServiceTest {//支持自动装配注入beanAutowiredprivate AccountService accountService;Testpublic void testFindById(){System.out.println(accountService.findById(1));}Testpublic void testFindAll(){System.out.println(accountService.findAll());}
}注意junit的依赖至少要是4.12版本,可以是4.13等版本,否则出现如下异常