Spring学习问题100问(5/2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GoGleTech/article/details/80347221

21、AOP切面实例化模型中perthis和pertarget有什么区别?

首先看定义:

  • perthis:每个切入点表达式匹配的连接点对应的AOP对象都会创建一个新切面实例;
  • pertarget:每个切入点表达式匹配的连接点对应的目标对象都会创建一个新的切面实例;

再看用法:

  • perthis使用@Aspect(“perthis(切入点表达式)”)指定切入点表达式;

    如@Aspect(“perthis(this(cn.javass.spring.chapter6.service.IIntroductionService))”)将对每个匹配“this(cn.javass.spring.chapter6.service.IIntroductionService)”切入点表达式的AOP代理对象创建一个切面实例,注意“IIntroductionService”可能是引入接口。

  • pertarget使用@Aspect(“pertarget(切入点表达式)”)指定切入点表达式;

    如@Aspect(“pertarget(target(cn.javass.spring.chapter6. service.IPointcutService))”)将对每个匹配“target(cn.javass.spring.chapter6.service. IPointcutService)”切入点表达式的目标对象创建一个切面,注意“IPointcutService”不可能是引入接口。

22、Spring中this和target是什么区别?

这两个关键子都是Spring中的切点标识符,两者定义上的区别:

  • this:切入点表达式的AOP代理对象
  • 切入点表达式的目标对象

    这两者的区别主要在于引入增强的这个场景,代码如下:

import org.aspectj.lang.annotation.Aspect;  
import org.aspectj.lang.annotation.Before;  
import org.aspectj.lang.annotation.DeclareParents;  
@Aspect  
public class PreGreetingAspect { 
    @DeclareParents(value = "com.baobaotao.expression.*", defaultImpl = GoodSeller.class)  //引入增强接口 
    public static Seller seller;  
    @Before(" execution(* greetTo(..)) && this(com.baobaotao.expression.Seller)")  //切面的通知
    public void recordUsage() {  
        System.out.println("Haha");  
    }  
}  

为com.baobaotao.expression包下的所有类引入Seller接口的实现,这样代理对象就都是Seller类型了,因此

@Before(" execution(* greetTo(..)) && this(com.baobaotao.expression.Seller)")  

匹配目标类的所有greetTo()方法(因为this匹配AOP代理对象)

@Before(" execution(* greetTo(..)) && target(com.baobaotao.expression.Seller)")  

不会匹配目标类的所有greetTo()方法。 (因为target匹配目标对象)

23、什么是Spring的引入接口?

考虑一下场景:

如果有这样一个需求,为一个已知的API添加一个新的功能。

由于是已知的API,我们不能修改其类,只能通过外部包装。但是如果通过之前的AOP前置或后置通知,又不太合理,最简单的办法就是实现某个我们自定义的接口,这个接口包含了想要添加的方法。

但是JAVA不是一门动态的语言,无法再编译后动态添加新的功能,这个时候就可以使用 aop:declare-parents 来做了。

通过配置AOP,实现为某一个类动态添加“implements 接口”:

<bean id="lilei" class="com.spring.test.declareparents.LiLei"/>
    <bean id="doSomething" class="com.spring.test.declareparents.DoSomething"/>

    <aop:config proxy-target-class="true">
        <aop:aspect>
            <aop:declare-parents 
            types-matching="com.spring.test.declareparents.LiLei"
            implement-interface="com.spring.test.declareparents.Add" 
            default-impl="com.spring.test.declareparents.DoSomething"/>
        </aop:aspect>
    </aop:config>
</beans>

其中types-mathcing是之前原始的类,implement-interface是想要添加的功能的接口,default-impl是新功能的默认的实现。

在使用时,直接通过getBean获得bean转换成相应的接口就可以使用了。

  Add lilei2 = (Add)ctx.getBean("lilei");
  lilei2.Todo();

24、什么叫数据库的批处理?

批处理就是把一批SQL脚本按顺序执行!
通常用GO来分割不同的批处理!

25、Hibernate是个什么玩意?

Hibernate可以理解为就是一个中间件。它负责把java程序的SQL语句接收过来并发送到数据库,而数据库返回的信息由Hibernate接收后直接生成一个对象传给java.

26、为什么要使用Hibernate?

我用JDBC完成可以把用户输入的信息存到数据库,等用到的时候也可以完全把他取出不好吗,何必费那么大劲学这个东西呢?

有如下几个原因:

  • 持久化技术封装了数据访问细节,为大部分业务逻辑提供面向对象的API。
  • 通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;
  • 代码重用性高,能够完成大部分数据库操作;
  • 松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。
  • 返回的对象可以实现继承、多态,使程序的代码表达更有张力

27、Hibernate这东西主要是怎么使的?

先说说配置文件,这东西是怎么配置的:

在Hibernate中有两个特有的文件:

.cfg.xml文件的作用是连接数据库,文件内部其实就是一个由user,password,url,driver组成的链接库的基本信息。
.hbm.xml文件是对数据库中表的映射文件。

再说说这东西怎么使用sql进行查询:

1、HQL(Hibernate Query Language)
此方式跟sql语句相识,但又有不同。呵呵,不要被表象迷惑,HQL是面向对象的,在HQL中对象的名称和属性是大小写敏感的。

2、Criteria query
它是Hql查询的延伸,提供了一些高级查询的功能

3、Native SQL Query
就是用sql语句查询,Hibernate也支持sql语句。

28、Hibernate中的OID和数据库表中的主键数值一样吗?

不一样
OID的生成方法:
1)increment 代理主键,hibernate自动以递增的方式来生成标识符,每次增加1.
2)identity 代理主键,由底层数据库生成标识符,前提就是底层的数据库支持自动增长的类型.
3)sequence 代理主键,hibernate根据底层数据库生成的标识符,前提是底层数据库支持序列
4)hilo 代理主键,hibernate根据higg/low算法来生成的标识符,把特定表的字段作为high的值,默认选用 hibernate_unique_key表的next_hi字段
5)native 代理主键,根据底层数据库对自动生成标识符的支持能力,还选择identity,sequence,或hilo.
6)uuid.hex 代理主键,hibernate采用128位的uuid算法生成标识符,uuid算法能够在网络环境下生成唯一字符串标识符.不过字符串要比数据占用的空间多的多.所以不流行使用.
7)assigned 适用于自然主键,由java应用程序负责生成标识符,为了能让java设置oid.不能吧setid方法设置为非公共类型了,这种方式也尽量避免使用.

29、Eclipse安装Hibernate插件

hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605.zip

30、数据库方言是一个什么东西?

Hibernate就相当于一个翻译,配置“方言”选项,就是告诉Hibernate它要说哪里的言。
因为不同的数据库,在Sql语句的设计上是存在差异的,就好比不同地方的人说不同的方言。而Hibernate呢,它会所有的“方言”,我们要做的,就是告诉它,我们需要它说哪种“方言”。


接上一篇博客:Spring学习问题100问(5/1)
接下一篇博客:Spring学习问题100问(5/3)

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页