IOC控制反转:
依赖注入:
需要的jar文件
dist\spring.jar
lib\jakarta-comnons\comnons-logging.jar
lib\aspectj\aspectjweaver.jar
aspectjrt.jar
lib/cglib/cglib nodep2.1_3.jar
lib\j2ee\common-annotation.jar
实例化Spring容器的方法
ApplicationContext ctx= new ClassPathXmlApplication(new String[]("beans.xml"));

三种实例化bean的方法
1、使用构造器实例化:(绝大部分都是用该方法)
ApplicationContext ctx= new ClassPathXmlApplication(new String[]("beans.xml"));
<bean id="orderService" class="bean的路径"></bean>
2、静态工厂方法实例化:
public class OrderFactory{
public static OrderServiceBean createOrder(){
   return new OrderServiceBean();
}
}
<bean id="orderService" class="工厂类路径" factory-method="工厂类方法名称createOrder"></bean>
3、实例工厂方法实例化
public class OrderFactory{
public OrderServiceBean createOrder(){
   return new OrderServiceBean();
}
}
<bean id="orderServiceFactory" class="工厂类路径"></bean>
<bean id="orderService" factory-bean="工厂类路径" factory-method="工厂类方法名称createOrder"></bean>

spring容器管理的bean对象的作用于
1、默认情况下是单实例(同一个bean);
2、<bean id="orderService" class="bean的路径" scope="prototye"></bean>添加了scope属性指定作用域时可以在每次getBean方法调用时生成一个新的实例;

spring管理的bean的生命周期
1、在默认情况下,在容器实例化的时候就对bean进行实例化了;
2、当scope="prototye"时,就在getBean方法时才实例化bean;
3、可以在beans.xml文件中设置lazy-init="true"来延迟初始化(在容器实例化的时候bean不实例化),实际中一般不用这个属性;
4、可以在beans.xml文件中设置init-method="方法名称"来在实例化bean完成后立刻调用该方法;
5、可以在beans.xml文件中设置destroy-method="方法名称"来在bean销毁的时候调用该方法;(默认情况下只有在应用关闭的时候才会关闭spring容器实例)正常的关闭方法是:
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");(注意是抽象类)
ctx.close();

依赖注入
在程序运行期间,由外部容器动态的将以来对象注入到组件中;
############就是让容器来实例化类(被注入的类),一定要添加属性的set方法#########################
注入方法:
1、通过属性的setter方法注入:(手动)
<bean id="personDao" class="business.dao.impl.PersonDaoBean"></bean>
<bean id="personServiceBean" class="businessbeans.impl.PersonServiceBean" init-method="open" destroy-method="destroy">
<property name="pd" ref="personDao"></property>
</bean>
使用bean的构造器注入依赖对象或基本类型
被注入的类中需要有构造函数,例如
public PersonServiceBean(PersonDao pd, String name) {
   super();
   this.pd = pd;
   this.name = name;
}
2、使用内部bean的方式,但该bean不能被其他bean使用:(不常用,手动)
<bean id="personServiceBean" class="businessbeans.impl.PersonServiceBean" init-method="open" destroy-method="destroy">
   <property name="pd">
   <bean id="personDao" class="business.dao.impl.PersonDaoBean"></bean>
</property>
</bean>
3、最优雅的依赖属性注入方法:使用Field注入(一般用于注解方式,手动)
添加lib\j2ee\commons-annotation.jar
添加context容器,并打开
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xmd
@Autowired默认按类型匹配 @Resource默认按名称匹配,无匹配名称则按类型匹配(推荐Resource方法)
@Resource(可缺省name="")根据属性的名称去xml文件中寻找对应的id或name,如果找到直接注入/如果没找到匹配属性的类型与xml中配置的类型,相同则注入;
可以不写get set方法

自动装配(不推荐使用)
不需要注解,只需要在<bean></bean>标签中添加autowire属性;必须要有set方法

不同类型数据的注入
1、类类型(如上)
2、注入一个普通属性(如String name="yanzhexian");
<bean id="personDao" class="business.dao.impl.PersonDaoBean"></bean>
<bean id="personServiceBean" class="businessbeans.impl.PersonServiceBean" init-method="open" destroy-method="destroy">
<property name="pd" ref="personDao"></property>
<property name="name" value="yanzhexian"></property>
</bean>
PS:spring会自动转换注入的普通类型到类中定义的类型
3、注入集合类型(set map list等)
set类型
<property name="sets">
   <set>
    <value>第一个</value>
    <value>第二个</value>
    <value>第三个</value>
   </set>
</property>

list类型
<property name="lists">
   <list>
    <value>一</value>
    <value>二</value>
    <value>三</value>
   </list>
</property>

property类型
<property name="properties">
   <props>
    <prop key="key1">value1</prop>
    <prop key="key2">value2</prop>
    <prop key="key3">value3</prop>
   </props>
</property>

Map类型
<property name="maps">
   <map>
    <entry key="key1" value="value1"></entry>
    <entry key="key2" value="value2"></entry>
    <entry key="key3" value="value3"></entry>
   </map>
</property>

PS:集合类型的定义与遍历
private Set<String> sets=new HashSet<String>();
private List<String> lists= new ArrayList<String>();
private Properties properties =new Properties();
private Map<String,String> maps=new HashMap<String,String>();

//尝试输出以来注入的集合属性sets
   System.out.println("=======Set======");
   for(String value:this.getSets()){
    System.out.println(value);
   }
//尝试输出依赖注入的list集合属性lists
   System.out.println("=======List======");
   for(String value:this.getLists()){
    System.out.println(value);
   }
//尝试输出依赖注入的Properties集合属性maps
   System.out.println("=======Properties======");
   for(String key:this.getProperties().keySet()){
    System.out.println(key+"="+this.getProperties().get(key));
   }
  
//尝试输出依赖注入的Map集合属性maps
   System.out.println("=======Map======");
   for(String key:this.getMaps().keySet()){
    System.out.println(key+"="+this.getMaps().get(key));
   }

给spring配置文件减肥(在类路径下用自动扫描的方式,注,没有添加依赖注入是不会有依赖属性注入的)
1、引入context这个命名空间和xmd文件
2、<context:component-scan base-package=""></context:component-scan>
3、标注@Service业务层 @Controller控制层 @Repository DAO层 @Component其他层
@Scope指定作用域范围 @PostConstruct指定bean初始化方法 @PreDestroy指定容器容器关闭的方法
4、使用注解时当不指定bean的名称,bean的名称就是类的简单名称(第一个字母小写)
5、可以在注释后面直接添加名称来定义bean的名称@Service("NAME");

AOP代理对象(主要是对权限管理模块应用)
代理对象--------目标对象
1、拦截所有业务方法,判断用户是否有权限,有权限就允许它执行业务方法,没有权限就不允许它执行业务方法(是否有权限根据user是否为null模拟)
2、用JDK提供的Proxy代理类来创建代理对象(目标对象必须实现接口);

如果目标对象没有实现接口
1、引入cglib.jar文件
2、用cglib来创建代理对象:
Enhancer enhancer = new Enhance();
enhancer.setSuperclass(this.targetObject.getClass);
enhancer.setCallback(this);
return enhancer.create();

PS:代理类一定要实现MethodInterceptor接口,并通过该接口来调用目标类中的业务方法;
AOP概念:前置通知,后置通知,例外通知,最终通知,环绕通知
Aspect切面 joinpoint连接点(拦截到的每一个业务方法) pointcut切入点(拦截所有的业务方法)
Advice通知() Target目标对象 Weave织入 Introduction引入

用spring进行AOP编程:
1、引入jar文件
2、配置配置文件:引入AOP的命名空间,

转载于:https://www.cnblogs.com/yanzhexian/archive/2010/08/17/1801180.html

Spring学习大杂烩(待续)相关推荐

  1. spring学习12 -Spring 框架模块以及面试常见问题注解等

    以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式-在AOP和remoting中被用的比较 ...

  2. 【Spring学习笔记-MVC-13.2】Spring MVC之多文件上传

    作者:ssslinppp       1. 摘要 前篇文章讲解了单文件上传<[Spring学习笔记-MVC-13]Spring MVC之文件上传>http://www.cnblogs.co ...

  3. Spring学习笔记(三) AOP_annotation,AOP_XML

    在学习课程以前,听说AOP有种很神秘的感觉,好像很好深的技术.其实原理很简单,使用动态代理的方式给程序增加逻辑.与此相似的有struts2中的filter拦截器. 再讲AOP之前先把需求说一下: 同S ...

  4. 送给 Java 程序员的 Spring 学习指南

    https://www.infoq.cn/article/Ad-8ghcGGCNU572U6oEX 学习 Spring 的基础要求 Spring 官网首页是这么介绍自己的--"Spring: ...

  5. Spring学习总结三

    Spring框架JdbcTemplate与事务 Spring学习总结三 0.需要的jar包 1.JdbcTemplate模板 1.1.JdbcTemplateAPI的操作 1.1.1.User类 1. ...

  6. Spring学习总结二

    Spring框架的代理与AOP.AspectJ Spring学习总结二 0.在理解什么是AOP之前的一些话 1.什么是AOP 2.AOP的重要概念 3.代理模式 3.1.静态代理 3.2.动态代理 3 ...

  7. Spring学习总结一

    Spring框架IoC与DI思想及应用 Spring学习总结一 1.Spring是什么 2.Spring的优点 2.1.关键概念 2.2.Spring的优点 3.Spring的架构图 3.1.核心容器 ...

  8. Spring学习(九)Spring 和数据库编程【了解】

    本文借鉴:Spring学习,Spring框架总结 一.传统 JDBC 回顾 用一个大佬的demo来简单看一下 /*** 使用jdbc,根据id查询单个Student的信息*/ public class ...

  9. Spring学习(八)AOP详解

    本文借鉴:Spring学习 一.一个例子 在上面的例子中,包租婆的核心业务就是签合同,收房租,那么这就够了,灰色框起来的部分都是重复且边缘的事,交给中介商就好了,这就是 AOP 的一个思想:让关注点代 ...

最新文章

  1. 我,某大学副教授+副处级,工资7300/月,老婆天天骂我窝囊废……
  2. MVC5+EF6 入门完整教程十
  3. 插件式程序开发及其应用(C#)
  4. 无法在 COM+ 目录中安装和配置程序集 microsoft.sqlserver.notificationservices.dll
  5. HTML 文件在PC移动端完美自适应布局的技巧
  6. 关于缓存的几篇好文章
  7. sql判断数据库类型数据_SQL数据类型
  8. CentOS7安装Nginx,全网最快安装教程
  9. Mac不再丝滑?这些有用的方法了解一下
  10. 强大的jQuery选择器之选定连续多行
  11. MATLAB编程与应用系列-第3章 矩阵运算(4)
  12. 拓端tecdat|R语言群组变量选择、组惩罚group lasso套索模型预测分析新生儿出生体重风险因素数据和交叉验证、可视化
  13. JavaSE基础——Java多线程(2)
  14. linux驱动无线网卡数据发送,基于Linux的无线网卡驱动程序
  15. linux下安装sqlite3
  16. Mybatis中Mapper标签总结大全
  17. python定义变量取值范围_python怎么限定函数自变量取值范围?
  18. 群晖NAS 7.X 搭建个人博客网站并发布公网 1/8
  19. 太酷了!我老了之后,也要这么“兴风作浪”!
  20. ​LeetCode刷题实战584:寻找用户推荐人

热门文章

  1. CryEngine3 引擎非商业用途将免费
  2. python 如何定义字典_python dict如何定义
  3. windows聚焦图片为什么不更新了_为什么年轻明星都不愿意接周星驰的戏? 林更新道出了事情的真相|周星驰|林更新|喜剧之王|演员...
  4. python中列表,元组,字符串如何互相转换
  5. android recyclerview 横向item 宽度,RecyclerView的item宽度不能全屏显示及线性布局与grid布局切换混乱解决方法...
  6. sql server2008如何修改mac地址_如何查看本机的MAC地址和IP地址?
  7. B系列台达服务器解密码步骤,台达HMI解密,DOP-A解密,DOP-B解密,文件密码解密
  8. 精馏塔matlab,MATLAB图解精馏塔理论塔板数程序代码
  9. 迪克逊准则matlab,浙江科技学院学报
  10. 【APICloud系列|25】 easeChat模块(环信-即时通讯)的实现