学习笔记正文:

1.bean标签

  1. 一个bean标签声明一个JavaBean对象<br /> spring会把创建好的对象放入Map中<br /> spring.put(id,对象)

2.Spring的容器对象

  1. ApplicationContext xx = new ClassPathXmlApplicationContext("配置文件路径");

3.容器对象的方法

  1. int .getBeanDefinitionCount() //返回容器中的对象个数<br /> String[] .getBeanDefinitionNames() //返回容器中所有对象的名字

4.利用配置文件,创建文件对象

  1. 只需要将bean标签上的class 换成java.io.File就行了<br /> 必须有构造参数,其中一种是,一个写绝对路径,一个写文件名

5.引用类型的自动赋值:

  1. 1>byName(按名称注入) bean id 引用类型的属性名相同,自动赋值<br /> 2>byType(按类型注入) bean class 引用类型的属性类型相同,自动赋值<br />

6.需要学习的注解:

  1. @Component<br /> @Repository<br /> @Service<br /> @Controller<br /> @Value<br /> @Autowired<br /> @Resource

7.@Component(创建JavaBean对象)

  1. 创建对象用=bean标签<br /> value是对象名称=bean id(唯一)

8.@Repository(创建数据交互层对象)

9.@Service(创建服务层对象)

10.@Controller(创建控制器对象)

11.注解如何生效?

  1. 在配置文件中创建扫描器<br /> <context:component-scan base-package="domain"/><br /> (需要有头部约束文件)

12.@Value

  1. 普通类型赋值

13.@Autowired

  1. 引用类型赋值,默认byType<br /> 如果要byName 的话 还要额外@Qualifier(value="bean的id")<br /> @Autowired还有一个属性,required,默认为true, 当为false时,即使找不到对应的引用类型对象,也不会报错,改为返回null

14.@Resource

  1. 引用类型赋值,默认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自动创建三个对象

  1. - DruidDataSource
  2. - 作用:连接数据库
  3. - 参数:数据库信息(地址账号密码连接数等)
  4. - SqlSessionFactoryBean
  5. - 作用:生成SqlSessionFactory
  6. - 参数:
  7. - DruidDataSourceid
  8. - mapper.xml的路径(位置)
  9. - MapperScannerConfigurer
  10. - 作用:读取mapper.xml信息生成对应的dao实例对象
  11. - 参数:
  12. - SQLSessionFactoryBeanid
  13. - 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:同理
  • 使用步骤:
    • 声明事务管理器对象



  1. - 开启事务注解驱动:告诉spring,我要使用注解的方式管理事务(aop的环绕通知),创建代理对象
  1. - 上一条可以换成aspectJ使用xml管理事务














28.创建web项目的流程

  • 创建maven web(注意web.xml的版本,注意最后加ContextLoaderListener监听器)
  • 加入依赖
  • 创建后端
  • 创建jsp发起请求
  • 创建servlet接受请求,调用service—>dao完成功能
  • 创建jsp显示结果

注意:
创建监听器

contextConfigLocation
classpath:spring.xml


org.springframework.web.context.ContextLoaderListener