- 学习笔记正文:
- 1.bean标签
- 2.Spring的容器对象
- 3.容器对象的方法
- 4.利用配置文件,创建文件对象
- 5.引用类型的自动赋值:
- 6.需要学习的注解:
- 7.@Component(创建JavaBean对象)
- 8.@Repository(创建数据交互层对象)
- 9.@Service(创建服务层对象)
- 10.@Controller(创建控制器对象)
- 11.注解如何生效?
- 12.@Value
- 13.@Autowired
- 14.@Resource
- 15.AspectJ的切入点表达式
- 16.spring的主xml配置文件中,如何声明 代理自动生成器?
- 17.指定通知方法中的参数:JoinPoint
- 18.@Before
- 19.@AfterReturning
- 20.@Around
- 21.@AfterThrowing
- 22.@After
- 23.@PointCut
- 24.CGLIB动态代理使用步骤
- 25.spring和mybatis的集成步骤
- 26.spring进行数据库操作感悟
- 27.处理事务需要做什么?
- 28.创建web项目的流程
学习笔记正文:
1.bean标签
一个bean标签声明一个JavaBean对象<br /> spring会把创建好的对象放入Map中<br /> spring.put(id,对象)
2.Spring的容器对象
ApplicationContext xx = new ClassPathXmlApplicationContext("配置文件路径");
3.容器对象的方法
int .getBeanDefinitionCount() //返回容器中的对象个数<br /> String[] .getBeanDefinitionNames() //返回容器中所有对象的名字
4.利用配置文件,创建文件对象
只需要将bean标签上的class 换成java.io.File就行了<br /> 必须有构造参数,其中一种是,一个写绝对路径,一个写文件名
5.引用类型的自动赋值:
1>byName(按名称注入) 即bean id 和 引用类型的属性名相同,自动赋值<br /> 2>byType(按类型注入) 即bean class 和 引用类型的属性类型相同,自动赋值<br />
6.需要学习的注解:
@Component<br /> @Repository<br /> @Service<br /> @Controller<br /> @Value<br /> @Autowired<br /> @Resource
7.@Component(创建JavaBean对象)
创建对象用=bean标签<br /> value是对象名称=bean id(唯一)
8.@Repository(创建数据交互层对象)
9.@Service(创建服务层对象)
10.@Controller(创建控制器对象)
11.注解如何生效?
在配置文件中创建扫描器<br /> <context:component-scan base-package="domain"/><br /> (需要有头部约束文件)
12.@Value
普通类型赋值
13.@Autowired
引用类型赋值,默认byType<br /> 如果要byName 的话 还要额外@Qualifier(value="bean的id")<br /> @Autowired还有一个属性,required,默认为true, 当为false时,即使找不到对应的引用类型对象,也不会报错,改为返回null
14.@Resource
引用类型赋值,默认byName,失败自动byType<br /> 如果只要byName的话,需要(name="bean的id")
15.AspectJ的切入点表达式
execution(modifiers-pattern? ret-type-pattern
declaring-type-pattern?name-pattern(param-pattern)
throws-pattern?)
解释:
modifiers-pattern 访问权限类型
ret-type-pattern 返回值类型
declaring-type-pattern 包名类名
name-pattern(param-pattern) 方法名(参数类型和参数个数)
throws-pattern 抛出异常类型
翻译过来就是:
execution(访问权限 返回值 方法名(参数) 异常类型)
16.spring的主xml配置文件中,如何声明 代理自动生成器?
程序运行时,他会在内存中自动生成所有曾经被添加了@Aspect注释的类的代理实例对象
默认使用jdk动态代理
17.指定通知方法中的参数:JoinPoint
JoinPoint就是要加入切面功能的业务方法
作用是可以在通知方法中获取方法执行时的信息,例如方法名称,方法的实参.
JoinPoint必须放在参数的第一个位置
18.@Before
- 定义方法,实现切面功能,在业务方法执行之前执行
1.public void
2.如果方法有参数,参数不是自定义的
19.@AfterReturning
- 定义方法,实现切面功能,在业务方法执行之后执行
1.public void
2.方法有参数,推荐使用Object(名称自定义),代表业务方法的返回值
特别注意:
当传入的参数是普通类型时,在切面功能中修改他,不会影响到业务方法中的结果;
然而,当传入的参数是自定义类型时,在切面功能中修改他,会影响到业务方法中的结果.
究其原因(猜测),
当把业务方法返回的自定义类型数据当做参数传递给切面方法时,由于自定义类型在内存中
的存储方式为栈中的引用指向堆中的对象,所以传参数实际上传递的是引用(即对象堆地址),
切面方法获得到堆地址,自然可以修改他的数据,对业务方法产生影响.
普通类型中的基本数据类型只存在于栈中,当将他当做参数传给一个方法时,
其实会新创建一个此类型的栈数据,供方法使用,改变他不会改变原来的栈数据.
普通类型中的String类型,因为其在常量池中具有不可修改性,故而当切面方法尝试修改他时,
反而会创建一个新的String数据在常量池,因此,他也不会对业务方法的结果产生影响.
20.@Around
- public
必须有返回值
方法有参数,固定:ProceedingJoinPoint
特点:(完全等同于jdk动态代理中的invoke方法)
1.在业务方法前后都能执行
2.控制业务方法是否被调用
3.修改业务方法的执行结果
4.ProceedingJoinPoint等同于jdk动态代理中的Method
21.@AfterThrowing
- 1.public void
2.方法参数有Exception, 也可以有JoinPoint
属性:1.value 切入点表达式
2.throwing 自定义变量,表示业务方法抛出的异常对象,变量名必须和方法参数名一样
特点:
1.业务方法抛出异常时执行
22.@After
- 1.public void
2.方法无参或者JoinPoint
属性:value 切入点表达式
特点:
业务方法执行完后执行,无论是否异常,都会执行(即finally)
23.@PointCut
- 定义管理切入点
特点:当使用他定义在一个方法上方,此时这个方法的名称就是切入点表达式的别名
其他通知中的value属性就可以用这个方法名称代替切入点表达式了
24.CGLIB动态代理使用步骤
在spring的主xml文件中,
这样,就会是框架使用CGLIB动态代理了
25.spring和mybatis的集成步骤
1.新建maven
2.加入依赖
1)spring
2)mybatis
3)mysql驱动
4)spring事务
5)mybatis和spring集成
3.创建实体类
4.创建dao接口和mapper文件
5.创建Service接口和实现类,属性是dao
6.创建spring主配置文件:声明mybatis对象交给spring创建
1)声明数据源
2)SQLSessionFactory
3)Dao对象
4)声明自定义的service
7.创建测试类,获取service对象,通过service调用dao完成数据库访问
26.spring进行数据库操作感悟
整个过程:连接到数据库,执行sql语句,(处理结果,关闭连接)
DruidDataSource类可以连接到数据库,
但总得知道数据库的信息吧?
于是开发者需要给它数据库信息
执行sql语句总得有执行语句的对象吧?总得有执行语句的内容吧?
1>SQLSessionFactoryBean类可以生成SQLSessionFactory对象(线程安全),他的作用是创建出SqlSession.
2>SqlSession的作用是利用getMapper(.class),就可以生成执行sql语句的对象,于此同时sql语句也会从.class对应的mapper.xml文件中读取出来,写成生成对象的一个方法,方法名就是*.class中的某个方法名(如何确定到底创建哪个方法名,答:mapper.xml文件中sql语句的id就是方法名).至此,我们就创建出了执行语句的对象,以及执行语句内容的方法.
综上所述:
我们需要让Spring自动创建三个对象
- DruidDataSource
- 作用:连接数据库
- 参数:数据库信息(地址账号密码连接数等)
- SqlSessionFactoryBean
- 作用:生成SqlSessionFactory
- 参数:
- DruidDataSource的id
- mapper.xml的路径(位置)
- MapperScannerConfigurer
- 作用:读取mapper.xml信息生成对应的dao实例对象
- 参数:
- SQLSessionFactoryBean的id
- mapper.xml的包名
27.处理事务需要做什么?
- 接口: PlatfromTransactionManager中定义了事务的commit,rollback方法
- 实现类:
- mybatis访问数据库:DataSourceTransactionManager
- hibernate访问数据库:HibernateTransactionManager
- 告诉spring你要使用哪一种方式访问数据库?
- 关于事务的类型:
- 事务的隔离级别:
- Default:Mysql的默认为Repeatable_Read;Oracle默认为Read_Committed
- Read_Uncommitted:读未提交,未解决任何并发问题
- Read_Committed:读已提交,解决脏读,存在不可重复读与幻读
- Repeatable_Read:可重复读,解决脏读,不可重复度,存在幻读
- Serializable:串行化,不存在并发问题
- 事务的超时时间:如果超时则回滚,单位为秒,默认为-1(不限制)
- 事务的传播行为:
- Propagation_Required
- Propagation_Required_New
- Propagation_Supports
- Propagation_Mandatory(不重要)
- Propagation_Nested(不重要)
- Propagation_Never(不重要)
- Propagation_Not_Supported(不重要)
- 提交回滚的时机:
- 业务方法执行成功,提交事务
- 业务方法抛出运行时异常或Error,回滚事务
- 业务方法抛出非运行时异常,主要是受查异常时,提交事务
- 事务的隔离级别:
- 总结(如何在spring中使用事务机制)
- 指定事务要使用的事务管理器实现类,使用
- 指定哪些类,哪些方法需要加入事务功能
- 制定方法需要的隔离级别,传播行为和超时
- 指定事务要使用的事务管理器实现类,使用
28.@Transactional
- 作用:放在一个public方法上面,代表此方法是事务方法
- 属性:
- propagation(枚举):设置事务传播属性,默认值为Propagation_Required
- isolation(枚举):设置事务的隔离级别,默认值为isolation.Default
- readOnly(boolean):用于设置方法对数据库的操作是否是只读的,默认值为false
- timeout(int):设置本操作与数据库连接的超时时间,单位为秒,默认值为-1
- rollbackFor(Class[]):指定需要回滚的异常类,默认值为空数组.如果只有一个异常类时,可以不使用数组
- rollbackForClassName(String[]):指定需要回滚到 异常类名,默认值为空数组,若只有一个,可以不是用数组
- noRollbackFor:同理
- noRollbackForClassName:同理
- 使用步骤:
- 声明事务管理器对象
- 开启事务注解驱动:告诉spring,我要使用注解的方式管理事务(aop的环绕通知),创建代理对象
- 上一条可以换成aspectJ使用xml管理事务
28.创建web项目的流程
- 创建maven web(注意web.xml的版本,注意最后加ContextLoaderListener监听器)
- 加入依赖
- 创建后端
- 创建jsp发起请求
- 创建servlet接受请求,调用service—>dao完成功能
- 创建jsp显示结果
注意:
创建监听器