spring二
spring里两个很重要的东西
1:IOC:控制反转:使用一个类里的方法;先创建一个类的实例,再调用方法;
IOC来创建只一次实例,其他人可共用,不需要新建实例;
使用IOC的好处:
1):可维护性高,便于进行单元测试,调试诊断故障比较方便;
2):可复用性高,
2:AOP:面向切面编程;
3:ApplicationContext:有3个实现类:
a:ClassPathXmlApplicationContext:从当前路径检查配置文件并加载创建容器的实例
ClassPathXmlApplicationContext cpxac=new ClassPathXmlApplicationContext(String str);
b:FileSystemApplicationContext:通过参数指定配置文件的位置,可访问类路径以外的其他资源
FileSystemApplicationContext fac=new FileSystemApplicationContext(String str)
c:WebApplicationContext:shi spring的web容器,可以通过配置文件进行配置,加载配置文件;
4:依赖注入:接口注入;(不常用)
set注入:变量私有化,提供一个set和get方法
构造器注入:使用构造方法
注解注入:
<!-- 启动包扫描 -->
<context:component-scan base-package="zxd.work"/>
控制层:
@Controller("userController")
public class UserController {
@Resource(name="userServiceImp")
private UserService userService;
服务层:
@Service("userService")
public class UserServiceImp implements UserService {
@Resource(name="udao")
private UserDaoImp udao;
持久层:
@Repository("udao")
public class UserDaoImp implements UserDao {
为属性注入值的注解
@Autowired//默认按照类型注入
@Qualifier("dataSource")按照名字注入就上下两个结合使用
//@Resource(name="dataSource")默认按照名字进行注入,若名字找不到,则按照类型匹配,一般使用Resource
private BasicDataSource dataSource;
或者:
@Resource(name="dataSource")//放在set上面
public void setDataSource(BasicDataSource dataSource) {
this.dataSource = dataSource;
}
@Component可以替换@Controller,@Service,@Repsitory,但是不用;
他们的区别:
4、区别 @Autowired 和 @Resource
@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;
@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;
@Resource注解是又J2EE提供,而@Autowired是由Spring提供,故减少系统对spring的依赖建议使用@Resource的方式;
@Resource和@Autowired都可以书写标注在字段或者该字段的setter方法之上。
在java代码中可以使用@Autowire或者@Resource注解方式进行装配,这两个注解的区别是:
@Autowire 默认按照类型装配,默认情况下它要求依赖对象必须存在如果允许为null,可以设置它required属性为false,
如果我们想使用按照名称装配,可 以结合@Qualifier注解一起使用;
@Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配,可以通过name属性指定,如果没有指定name属 性,
当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取
属性名作为bean名称寻找 依赖对象.
注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖的对象时候,会回退到按照类型装配,但一旦指定了name属性,
就只能按照名称 装配了.
***AOP网址:http://www.cnblogs.com/oumyye/p/4480196.html
IOC:控制反转,创建对象实例的控制权从代码控制剥离到IOC容器控制;
DI:依赖注入,一旦创建实例,为这个对象注入属性值,或者是其他对象的实例,侧重于实现;
AOP:面向切面编程,典型的动态代理模式的体现,aop是对oop(面向对象)编程的一种补充和完善;oop引入封装继承多态建立一个
层次结构,模拟一个公共行为的集合;但对分散的对象引入公共行为,oop能力弱,因为是自上而下的流程执行,不适合定义
从左到右流程关系,例如日志功能,日志代码分散到所有的对象层次中,与我们分散的对象的核心代码毫无关系,导致大量
大量代码重复,不利于各模块的重用性;
解决办法:将程序中交叉的业务(日志,安全,事务)封装成 一个切面,然后注入到目标对象中。
实现AOP技术:1:动态代理技术,利用截取消息放手,对消息进行装饰,以代替原来对象行为的执行;
2:静态植入,引用特定的语法创建切面,从而编译器在编译期间植入有关的代码;
<!-- 开启aop动态代理 -->
<aop:aspectj-autoproxy/>
<aop:aspectj-autoproxy proxy-target-class="true"/>
xml里加上aop的网络配置
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd