Spring入门
使用 spring 的 IOC 解决程序耦合
bean.xml配置
ApplicationContext的三个实现类:
ClassPathXmlApplicationContext:它可以加载类路径下的配置文件,要求配置文件必须在类路径下
FileSystemXmlApplicationContext:它可以加载磁盘任意路径下的配置文件(必须有权限)
AnnotationConfigApplicationContext:用于读取注解,创建容器
核心容器的两个接口引发出的问题
ApplicationContext单例对象适用:它在构建核心容器的时候,创建对象是采用立即加载的方式,也就是说,只要一读取完配置文件就创建
BeanFactory多例对象适用:它在构建核心容器的时候,创建对象是采用延迟加载的时候
获取核心容器对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
根据id获取bean对象,两种方式
IAccountService service = (IAccountService) applicationContext.getBean("accountService");
IAccountService accountService = applicationContext.getBean("accountService",IAccountService.class);
创建bean的三种方式
第一种方式:使用默认构造函数创建
在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。
采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。
第二种方式: 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器
第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
bean标签的scope属性:
作用:用于指定bean的作用范围
取值: 常用的就是单例的和多例的
singleton:单例的(默认值)
prototype:多例的
request:作用于web应用的请求范围
session:作用于web应用的会话范围
global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session
bean对象的生命周期
单例对象
出生:当容器创建时对象出生
活着:只要容器还在,对象一直活着
死亡:容器销毁,对象消亡
总结:单例对象的生命周期和容器相同
多例对象
出生:当我们使用对象时spring框架为我们创建
活着:对象只要是在使用过程中就一直活着。
死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收
spring中的依赖注入
构造函数注入:
标签中的属性
type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
name:用于指定给构造函数中指定名称的参数赋值 常用的
=============以上三个用于指定给构造函数中哪个参数赋值===============================
value:用于提供基本类型和String类型的数据
ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
public AccountServiceImpl(String name, Integer age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
set方法注入 常用的
涉及的标签:property
出现的位置:bean标签的内部
标签属性:
name:用于指定给构造函数中指定名称的参数赋值
=============以上三个用于指定给构造函数中哪个参数赋值===============================
value:用于提供基本类型和String类型的数据
ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象
复杂类型的注入/集合类型的注入
用于给list结构集合注入的标签:
list array set
用于给map结构集合注入的标签:
map props
private String name;
private Integer age;
private Date birthday;
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
AAA
BBB
CCC
AAA
BBB
CCC
AAA
BBB
CCC
bean.xml和注解配置
告知spring在创建容器时扫描的包,配置所需要的标签不是在bean的约束中,而是一个名称为context名称空间和约束中
用于创建对象的:
@Component:
作用:用于把当前类对象存入spring容器中
属性:value:用于指定bean的id
@Controller:一般用于表现层
@Service:一般用于业务层
@Repository:一般用在持久层
用于注入数据的
@Autowired:
作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功
如果ioc容器中没有任何bean类型和要注入的类型相匹配,则报错
如果ioc容器中有多个类型匹配时:
出现为位置:可以是成员变量上,也可以是方法上
细节:在使用注解注入的时候set就不是必须的了
@Qualifier:
作用:再按照类型注入的基础上再按照名称注入。在给类成员注入的时候不能单独使用,但在给方法参数注入时可以
属性:value:用于注入bean的id
@Autowired
@Qualifier("accountDao1")
private IAccountDao accountDao = null;
Resource
作用:直接按照bean的id注入,他可以独立使用
属性:name:用于之指定bean的id
@Resource(name = "accountDao1")
private IAccountDao accountDao = null;
上述基本类型和String都无法注入 集合只能用xml来实现
@Value:
作用:用于注入基本类型和String的数据
属性:
value:用于指定数据的值 它可以使用springEL(spring的el表达式)
spel的写法${表达式};
用于改变作用范围的
bean中的scope属性 一样
@Scope
作用:用于指定bean作用范围
属性:
value:指定范围的取值。常用取值。singleton prototype
和生命周期相关的(了解)
bean中的使用init_method destroy-method 一样
@PreDEstroy
作用:用于指定销毁
@PostConstruct
作用:用于指定初始化
全用注解
该类是一个配置类,它的作用和bean.xml是一样的
Spring中的注解 spring整合junit id属性:是给切面提供一个标识符 我们现在示例是让printLog方法在切入点方法之前,所以是前置通知 关键字:execution(表达式) 实际开发中 @Aspect:表示当前面是一个切面 导入事务的约束 tx的名称空间和约束,同时也需要aop的 事务通知标签的内部txAdvice @Transactional注解 开启spring对注解事务的支持 在需要事务支持的地方使用 bean.xml的文件 配置事务管理器
@Configuration
指定当前类是一个配置类
细节:当配置类作为AnnotationConfigApplicationContext对象的参数时可以不写
@ComponentScan
用于通过注解指定Spring在创建容器时要扫描的包
属性:
value:它和basePackage的作用时一样的,都是用于指定创建容器时要扫描的包
使用此注解就相当于在xml中配置了:使用junit单元测试
1,导入spring整合的jar坐标
2,使用junit提供的一个注解把原有的main方法替换了,替换成spring提供的
@Runwith
3,告知spring的运行器,spring和ioc的创建是基于xml还是注解的,并说明其位置
@ContextConfiguration
location:指定xml文件的位置,加上classpath关键字,表示在类路径下
classes:指定注解类
当我们使用spring 5.x时 junit的jar必须是4.12及以上@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class) 注解的时候
@ContextConfiguration("classpath:bean.xml") 有配置文件的时候
public class AccountServiceTest {
@Autowired
private IAccountService accountService = null;
}
private ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml"); xml文件配置
private ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class); 注解配置
spring中xml的AOP的配置步骤
1,把通知的Bean也交个spring来管理
2,使用aop:config标签表明AOP的开始配置
3,使用aop:aspect标签表明配置切面
ref属性:是指定通知类bean的id4,在aop:aspect标签的内部使用对应标签来配置通知的类型
aop:before: 表示前通知
method:用于指定Logger类中那个方法是前置的
pointcut:用于指定切入点表达式:该表达式的含义指的是对业务层中哪些方法增强切入点表达式:
表达式:
访问修饰符 返回值 包名类名方法名参数列表)
public void com.service.impl.AccountServiceImpl.saveAccount(参数)
访问修饰符可以省略
返回值可以使用号,表示任意返回值
包名可以使用号,表示任意包,但是有几级包,需要写几个*
使用..来表示当前包,及其子包
类名可以使用号,表示任意类
方法名可以使用号,表示任意方法
参数列表可以使用*,表示参数可以是任意数据类型,但是必须有参数
参数列表可以使用..表示有无参数均可,有参数可以是任意类型
全通配写法 * *..*.*(..)
* com.service.impl.*.*(..)
注解配置AOP
@Pointcut:表达式:关键字:execution(表达式)
@Before():
@AfterReturning():
@AfterThrowing():
@After():配置开启spring注解AOP的支持 在Bean.xml中
spring基于xml的生命事务控制的配置步骤
1,配置事务管理器
2,配置事务通知
使用tx:advice标签配置事务通知
属性:
id:给事务通知起个唯一标识
transaction-manager:给事务通知提供一个事务管理器引用3,配置aop中的通用切入点表达式
4,建立事务通知和切入点表达式的对应关系
5,配置事务的属性
isolation:用于指定事务的隔离级别,默认值是DEFAULT, 表示使用数据库的默认隔离级别
propagation:用于指定事务的传播行为,默认值是REQUIRED,表示一定会有事务,增删改的选择 查询方法可以用SUPPORTS
read-only:用于指定事务是否值读,只有查询方法才能设置为true,默认值是false,表示读写
timeout:用于指定事务的超时时间,默认值是-1,表示永不超时,如果指定数值,以秒为单位
no-rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚,没有默认值,表示任何异常都回滚
rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时,事务回滚,没有默认值,表示任何异常都回滚
spring基于注解的生命事务控制的配置步骤
1,配置事务管理器
2,开启spring对注解事务的支持
3,在需要事务支持的地方使用
配置事务管理器
@Transactional
public class AccountServiceImpl implements IAccountService {}
全注解
开启spring对注解事务的支持@Configuration
@ComponentScan("com.itheima")
@Import({JdbcConfig.class,TransactionConfig.class})
@PropertySource("jdbcConfig.properties")
//开启spring对注解事务的支持
@EnableTransactionManagement
public class SpringConfiguration {
}
public class TransactionConfig {
/**
* 用于创建事务管理器对象
* @param dataSource
* @return
*/
@Bean(name = "transactionManager")
public PlatformTransactionManager createTransactionManager(DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
}