Spring框架教学 PowerPoint 演示文稿

上传人:优*** 文档编号:115303364 上传时间:2022-07-01 格式:PPT 页数:95 大小:1.75MB
收藏 版权申诉 举报 下载
Spring框架教学 PowerPoint 演示文稿_第1页
第1页 / 共95页
Spring框架教学 PowerPoint 演示文稿_第2页
第2页 / 共95页
Spring框架教学 PowerPoint 演示文稿_第3页
第3页 / 共95页
资源描述:

《Spring框架教学 PowerPoint 演示文稿》由会员分享,可在线阅读,更多相关《Spring框架教学 PowerPoint 演示文稿(95页珍藏版)》请在装配图网上搜索。

1、SpringSpring企业开发企业开发广西柳州创景软件人才实训中心广西柳州创景软件人才实训中心 Spring是什么SpringSpring是一个开源的控制反转是一个开源的控制反转(Inversion of (Inversion of Control ,IoC)Control ,IoC)和面向切面和面向切面(AOP)(AOP)的的容器容器框架框架. .它的主要它的主要目的是简化企业开发目的是简化企业开发. .IOC 控制反转 public class PersonService /服务层 private PersonDao personDao = new PersonDaoBean(); pu

2、blic void save(Person person)/保存一个对象 personDao.save(person); PersonDaoBean 是在应用内部应用内部创建及维护的(在PersonService 类中new出来的)。所谓控制反转就是应用本身不负责应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。依赖注入(Dependency Injection)当我们把依赖对象交给外部容器负责创建,那么PersonService 类可以改成如下:public class PersonService pri

3、vate PersonDao personDao ; /通过构造器参数,让容器把创建好的依赖对象注入进PersonService,当然也可以使用setter方法进行注入。 public PersonService(PersonDao personDao) this.personDao=personDao; public void save(Person person) personDao.save(person); 所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。为何要使用Spring在项目中引入spring立即可以带来下面的好处l降低组件之间的耦合度,实现软件各层之间的

4、解耦。 l 可以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人员就不再需要手工控制事务.也不需处理复杂的事务传播。l容器提供单例模式支持,开发人员不再需要自己编写实现代码。l容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。l容器提供的众多辅作类,使用这些类能够加快应用的开发,如: JdbcTemplate、 HibernateTemplate。lSpring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts等,这样更便于应用的开发。ControllerServiceDAO使用Spring的好处当使用s

5、pring时,我们可以使用容器提供的众多服务如果使用Spring, 我们就不再需要手工控制事务public void savePerson()People people = new People();people.setCardNo(452225197811246239);people.setName(李四李四);try session.save(people);mit(); catch (HibernateException e) transaction.rollback();e.printStackTrace();使用使用Hibernate框架需要框架需要手工提交事务手工提交事务另外,如果

6、使用spring, 我们也不需要处理复杂的事务传播行为public void payment() Bean1.update();/更新金额 Bean2.save();/记录操作日志如果我们不使用Spring,针对下面这两种业务需求,我们该如何做?第1种可能的业务需求:要求Bean1.update()和Bean2.save()在同一个事务中执行。第2种可能的业务需求:要求不管Bean1.update() 的事务是否成功,都需要记录操作日志。public class Bean1 public void update()/注意:下面省略了一些代码 Connection conn = null; co

7、nn.setAutoCommit(false); Statement.executeUpdate(“update account set amount=? where id=?); public class Bean2 public void save()/注意:下面省略了一些代码 Connection conn = null; conn.setAutoCommit(false); Statement.executeUpdate(“insert into Log (content) values (?); 使用Spring,不再需要我们处理复杂的事务传播行为使用Spring,我们只需要通过声明

8、式的事务属性配置就可以轻松地实现这两种业务需求1.要求Bean1.update()和Bean2.save()的在同一个事务中执行2.要求不管Bean1.update() 的事务是否成功,都需要记录日志。Transactional(propagation=Propagation.Required)public void payment() Bean1.update();/更新金额 Bean2.save();/记录日志 public class Bean1 Transactional(propagation=Propagation.Required) public void update() ex

9、ecuteUpdate(“update account set amount=? where id=?); public class Bean2 Transactional(propagation=Propagation.RequiresNew) public void save()executeUpdate(“insert into Log (content) values (?); 轻量级与重量级概念的划分经常会有同学问到经常会有同学问到springspring属于轻量级框架属于轻量级框架, ,还是重量框架还是重量框架? ?其实划分一个应用是否属于其实划分一个应用是否属于轻量级还是重量级轻

10、量级还是重量级, ,主要看它使用了多少服务主要看它使用了多少服务. .使用的服务越多使用的服务越多, ,容器要为普通容器要为普通javajava对对象做的工作就越多象做的工作就越多, ,必然会影响到应用的发布时间或者是运行性能必然会影响到应用的发布时间或者是运行性能. .对于对于spring容器,它提供了很多服务容器,它提供了很多服务,但这些服务并不是默认为应用打开的但这些服务并不是默认为应用打开的,应用需要某种服务应用需要某种服务,还还需要指明使用该服务需要指明使用该服务,如果应用使用的服务很少如果应用使用的服务很少,如如:只使用了只使用了spring核心服务核心服务,那么我们可以认那么我们

11、可以认为此时应用属于轻量级的为此时应用属于轻量级的,如果应用使用了如果应用使用了spring提供的大部分服务提供的大部分服务,这时应用就属于重量级。这时应用就属于重量级。目前目前EJB容器就因为它默认为应用提供了容器就因为它默认为应用提供了EJB规范中所有的功能规范中所有的功能,所以它属于重量级。所以它属于重量级。使用Spring需要的jar到http:/www.springsource.org/download下载spring,然后进行解压缩,在解压目录中找到下面jar文件,拷贝到类路径下distspring.jardistspring.jarlibjakarta-commonscommon

12、s-logging.jarlibjakarta-commonscommons-logging.jar如果使用了切面编程如果使用了切面编程(AOP),(AOP),还需要下列还需要下列jarjar文件文件lib/aspectj/aspectjweaver.jarlib/aspectj/aspectjweaver.jar和和aspectjrt.jaraspectjrt.jarlib/cglib/cglib-nodep-2.1_3.jarlib/cglib/cglib-nodep-2.1_3.jar如果使用了如果使用了JSR-250JSR-250中的注解中的注解, ,如如Resource/PostCo

13、nstruct/PreDestroy,Resource/PostConstruct/PreDestroy,还需要下列还需要下列jarjar文件文件libj2eecommon-annotations.jarlibj2eecommon-annotations.jar本次课程使用的本次课程使用的Spring版版本是本是2.5使用myeclipse添加Spring应用第一步:创建第一步:创建web工程工程(其其实普通实普通j2se工程也可以工程也可以)使用myeclipse添加Spring应用第二步:在第二步:在web工程中添工程中添加加Spring框架支持框架支持使用myeclipse添加Sprin

14、g应用这里只是简单应用,没有这里只是简单应用,没有涉及到和其它框架的集成,涉及到和其它框架的集成,因此选择前面两个就可以因此选择前面两个就可以了。了。使用myeclipse添加Spring应用这步的目的是生成这步的目的是生成Spring配置文配置文件件applicationContext.xml文件文件位置是位置是src使用myeclipse添加Spring应用框架添加完成之框架添加完成之后的效果后的效果使用myeclipse添加Spring应用public class UserInfo private Integer id;private String name;private String

15、 address;private Integer age;/set and get method第三步:创建一个实体类第三步:创建一个实体类;并生成并生成属性对应的属性对应的set/get方法方法使用myeclipse添加Spring应用第四步:根据左边的实体类属性名称和数据类型在第四步:根据左边的实体类属性名称和数据类型在Spring配配置文件中配置一个置文件中配置一个bean;这个这个bean的的id值是值是userInfoBean这这个个id属性名称对应的值在属性名称对应的值在applicationContext.xml必须是必须是唯唯一一;不能存在同名不能存在同名;在应用程序中将根据在

16、应用程序中将根据id名称来获取这个名称来获取这个bean使用myeclipse添加Spring应用/编写测试类编写测试类,从从Spring容器中获取容器中获取userInfoBeanpackage .chongking;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanUtil public static void main(String args) App

17、licationContext context = new ClassPathXmlApplicationContext(applicationContext.xml);UserInfo userInfo = (UserInfo)context.getBean(“normalBean);System.out.println(userInfo.getName()+:+userInfo.getAddress();第五步:编写测试类;从第五步:编写测试类;从spring容器中根据容器中根据bean的的id获获取取bean对象对象userInfoBean是是applicationContext.xml

18、配置配置文件中的文件中的bean id属性值属性值applicationContext.xml使用eclipse添加Spring应用使用使用eclipse开发开发Spring应用需要自己添加使用到的应用需要自己添加使用到的jar文件和文件和spring配置文件配置文件(applicationContext.xml)其它的配置和测试跟使用其它的配置和测试跟使用myeclipse是一样的。在是一样的。在java体系中体系中绝大部分的框架应用所涉及到的引用基本上都是绝大部分的框架应用所涉及到的引用基本上都是jar文件和配置文件。文件和配置文件。Jar文件和配置文件有多种渠道可以获取文件和配置文件有多

19、种渠道可以获取;可以从官方网站上下载;可以使用别人现有的;可以从官方网站上下载;可以使用别人现有的;可以通过其它渠道获取。可以通过其它渠道获取。spring的配置文件模版.该配置模版可以从该配置模版可以从springspring的参考手册或的参考手册或springspring的例子中得到。配置文件的取名可以任意,文的例子中得到。配置文件的取名可以任意,文件可以存放在任何目录下,但考虑到通用性,一般放在类路径下。件可以存放在任何目录下,但考虑到通用性,一般放在类路径下。编写spring配置文件时,不能出现帮助信息由于由于spring的的schema文件位于网络上,如果机器不能连接到网络,那么在编

20、写文件位于网络上,如果机器不能连接到网络,那么在编写配置信息时候就无法出现提示信息,解决方法有两种:配置信息时候就无法出现提示信息,解决方法有两种:1。让机器上网,让机器上网,eclipse会自动从网络上下载会自动从网络上下载schema文件并缓存在硬盘上。文件并缓存在硬盘上。2。手动添加手动添加schema文件文件,方法如下:方法如下:windwos-preferences-myeclipse-files and editors-xml-xmlcatalog点点add,在出现的窗口中的在出现的窗口中的Key Type中选择中选择URI,在在location中选中选File system,然后

21、在然后在spring解压目录的解压目录的dist/resources目录中选择目录中选择spring-beans-2.5.xsd,回到设置窗口的时候不要急着关闭窗口回到设置窗口的时候不要急着关闭窗口,应把窗口中的应把窗口中的Key Type改为改为Schema location,Key改为改为http:/www.springframework.org/schema/beans/spring-beans-2.5.xsd实例化spring容器实例化实例化Spring容器常用的两种方式:容器常用的两种方式:方法一方法一:在类路径下在类路径下寻找配置文件来寻找配置文件来实例化容器实例化容器Applic

22、ationContext ctx = new ClassPathXmlApplicationContext(new Stringbeans.xml);方法二方法二:在文件系统路径下寻找配置文件来实例化容器在文件系统路径下寻找配置文件来实例化容器ApplicationContext ctx = new FileSystemXmlApplicationContext(new String“d:beans.xml“);Spring的配置文件可以指定多个,可以通过String数组传入。从spring容器中得到bean当spring容器启动后,因为spring容器可以管理bean对象的创建,销毁等生命周

23、期,所以我们只需从容器直接获取Bean对象就行,而不用编写一句代码来创建bean对象。从容器获取bean对象的代码如下:ApplicationContext ctx = new ClassPathXmlApplicationContext(“beans.xml”);OrderService service = (OrderService)ctx.getBean(personService);使用dom4j读取spring配置文件public class ClassPathXmlApplicationContext private List beanDefines = new ArrayList

24、(); public ApplicationContext(String filename) init(filename); private void init(String filename) SAXReader saxReader = new SAXReader(); Document document=null; try URL xmlpath = this.getClass().getClassLoader().getResource(filename); document = saxReader.read(xmlpath); Map nsMap = new HashMap(); ns

25、Map.put(ns,http:/www.springframework.org/schema/beans);/加入命名空间 XPath xsub = document.createXPath(/ns:beans/ns:bean);/创建beans/bean查询路径 xsub.setNamespaceURIs(nsMap);/设置命名空间 List beans = xsub.selectNodes(document);/获取文档下所有bean节点 for(Element element: beans) String id = element.attributeValue(id);/获取id属性

26、值 String clazz = element.attributeValue(class); /获取class属性值 BeanDefinition beanDefine = new BeanDefinition(id, clazz); beanDefines.add(beanDefine); catch(Exception e) e.printStackTrace(); 三种实例化bean的方式-使用类构造器实例化/实体类设计实体类设计public class UserInfo private Integer id;private String name;private String add

27、ress;private Integer age;/构造子构造子public UserInfo()/构造子构造子public UserInfo(Integer id,String name,String address,Integer age)this.id = id;this.name = name;this.address = address;this.age = age;/set and get methodapplicationContext.xml配置配置/从从Spring容器获取容器获取Bean测试代码测试代码public void getUserInfo()UserInfo us

28、erInfo = (UserInfo)context.getBean(normalBean);System.out.println(userInfo.getId()+ : +userInfo.getName()+:+userInfo.getAddress();三种实例化bean的方式-使用静态工厂方法实例化/工厂类设计工厂类设计public class BeanFactory public static UserInfo factoryDao() return new UserInfo(1,王五王五,南宁南宁,21);applicationContext.xml配置配置public void

29、staticFactoryBean()/测试代码测试代码UserInfo userInfo = (UserInfo)context.getBean(staticFactoryBean);System.out.println(userInfo.getId()+ : +userInfo.getName()+:+userInfo.getAddress();/实体类设计实体类设计public class UserInfo private Integer id;private String name;private String address;private Integer age;/构造子构造子pu

30、blic UserInfo()/构造子构造子public UserInfo(Integer id,String name,String address,Integer age)this.id = id;this.name = name;this.address = address;this.age = age;/set and get method三种实例化bean的方式-使用实例工厂方法实例化/工厂类设计工厂类设计public class BeanFactory public UserInfo createUserInfo() return new UserInfo(1,王五王五,南宁南宁,

31、21); applicationContext.xml配置配置/使用实例工厂方法实例化测试使用实例工厂方法实例化测试public void instanceFactoryBean() UserInfo userInfo = (UserInfo)context.getBean(instanceFactoryBean); System.out.println(userInfo.getId()+ : +userInfo.getName()+:+userInfo.getAddress();Bean的作用域(scope属性属性).singleton 在每个Spring IoC容器中一个bean定义只有一

32、个对象实例。默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。如: 如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true“,如下:可以通过在构造函数中输出信息来跟踪.prototype 每次从容器获取bean都是新的对象。.request .session .global sessionrequest,session,global session是针对web程序而言的指定Bean的初始化方法和销毁方法指定Bean的初

33、始化方法和销毁方法import org.junit.*;import org.springframework.context.support.AbstractApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanUtil AbstractApplicationContext context = null;/Spring容器对象容器对象(注意:不是注意:不是ApplicationContext)Beforepublic void b

34、efore() System.out.println(before.); context = new ClassPathXmlApplicationContext(applicationContext.xml);Testpublic void getEmployeeBean() /Employee类中有两个方法:类中有两个方法:init();和和close() Employee employee = (Employee)context.getBean(empBean); System.out.println(employee.getName();Afterpublic void after()

35、 context.close();/需要显示调用需要显示调用注入依赖对象注入依赖对象- -基本类型对象注入基本类型对象注入public class Employee /实体类设计实体类设计private Integer id;private String name;private String address;public Employee() System.out.println(不带参数的构造方法不带参数的构造方法.);public Employee(Integer id,String name,String address) System.out.println(带参数构造函数带参数构造

36、函数.); this.id = id; this.name = name; this.address = address;/set and get method.注入依赖对象注入依赖对象- -构造器注入构造器注入applicationContext.xml配置配置 实体类构造方法实体类构造方法public Employee(Integer id,String name,String address) System.out.println(带参数构造函数带参数构造函数.); this.id = id; this.name = name; this.address = address;Testpu

37、blic void getEmployeeBean()/测试方法测试方法 Employee employee = (Employee)context.getBean(empBean); System.out.println(employee.getId()+ : +employee.getName()+ : +employee.getAddress();注入依赖对象注入依赖对象- -注入其它注入其它Bean-1applicationContext.xml配置配置 public class Cpu public void hardwareInfo() System.out.println(AMD

38、 速龙速龙); Testpublic void getComputer()/测试类测试类 Computer computer = (Computer)context.getBean(computerBean); computer.testCput();public class Computer private Cpu cpu; /set方法是必须的方法是必须的(set注入注入) public void setCpu(Cpu cpu) this.cpu = cpu; public Cpu getCpu() return cpu; public void testCput() cpu.hardwa

39、reInfo(); 注入依赖对象注入依赖对象- -注入其它注入其它Bean-2applicationContext.xml配置配置 public class Cpu public void hardwareInfo() System.out.println(AMD 速龙速龙); Testpublic void getComputer()/测试类测试类 Computer computer = (Computer)context.getBean(computerBean); computer.testCput();public class Computer private Cpu cpu; /se

40、t方法是必须的方法是必须的(set注入注入) public void setCpu(Cpu cpu) this.cpu = cpu; public Cpu getCpu() return cpu; public void testCput() cpu.hardwareInfo(); 使用内部使用内部bean,但该但该bean不能被其他不能被其他bean使用使用练习-通过Bean注入模拟计算机组装/接口设计接口设计public interface USB /USB接口信息接口信息 public void info(String content);public interface Iprint /

41、打印机接口信息打印机接口信息 public void info(String content);public class Memory /内存类内存类 public void info(String config) System.out.println(内存配置:内存配置:+config); public class Computer /计算机类计算机类 private USB usb;private Iprint print;private Memory memory;public void showHardWareInfo() usb.info(移动硬盘移动硬盘); print.info(

42、彩色打印机彩色打印机); memory.info(金士顿内存条金士顿内存条);/省略了省略了set、get方法方法applicationContext.xml配置配置Testpublic void getComputer()/模拟计算机组装测试方法模拟计算机组装测试方法 Computer computer = (Computer)context.getBean(computerBean); computer.showHardWareInfo();/接口实现类接口实现类public class UDisk implements USB public void info(String config

43、) System.out.println(usb接口配置:接口配置:+config); public class ColorPrint implements Iprint public void info(String config) System.out.println(彩色打印机:彩色打印机:+config); 集合类型的装配集合类型的装配 cjkj set cjkj Testpublic void getOrder()/测试类测试类 Order order = (Order)context.getBean(order); List lists = order.getLists(); fo

44、r (String s : lists) System.out.println(s); public class Order private Set sets = new HashSet(); private List lists = new ArrayList(); private Properties properties = new Properties(); private Map maps = new HashMap(); ./这里省略属性的这里省略属性的getter和和setter方法方法依赖注入依赖注入l使用构造器注入l使用属性setter方法注入l使用Field注入(用于注解方

45、式)注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。1.手工装配依赖对象2.自动装配依赖对象依赖注入依赖注入-手工装配手工装配依赖对象,在这种方式中又有两种编程方式手工装配依赖对象,在这种方式中又有两种编程方式1. 在xml配置文件中,通过在bean节点下配置,如 /构造器注入(带参构造函数第1个值) /构造器注入(带参构造函数第2个值) /构造器注入(带参构造函数第3个值) /属性setter方法注入2. 在java代码中使用Autowired或Resource注解方式进行装配。但我们需要在xml配置文件中配置

46、以下信息: 这个配置隐式注册了多个对注释进行解析处理的处理器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor 注: Resource注解在spring安装目录的libj2eecommon-annotations.jar依赖注入依赖注入-手工装配在在java代码中使用代码中使用Autowired或或Resource注解方式进行装配,这两个注解的区别是:注解

47、方式进行装配,这两个注解的区别是:Autowired 默默认按类型装配认按类型装配,Resource默认按名称装配默认按名称装配,当找不到与名称匹配的,当找不到与名称匹配的bean才会按类型装配。才会按类型装配。 Autowired private PersonDao personDao;/用于字段上用于字段上 Autowired public void setOrderDao(OrderDao orderDao) /用于属性的用于属性的setter方法上方法上 this.orderDao = orderDao; Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如

48、果允许注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它值,可以设置它required属性属性为为false Autowired (required=false)。如果我们想使用按名称装配,可以结合。如果我们想使用按名称装配,可以结合Qualifier注解一起使用。如下:注解一起使用。如下: Autowired Qualifier(personDaoBean) private PersonDao personDao;Resource注解和注解和Autowired一样,也可以标注在字段或属性的一样,也可以标注在字段或属性的setter方法上,但它默认按名称

49、装配。名称可以通过方法上,但它默认按名称装配。名称可以通过Resource的的name属性指定,如果没有指定属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依名称寻找依赖对象,当注解标注在属性的赖对象,当注解标注在属性的setter方法上,即默认取属性名作为方法上,即默认取属性名作为bean名称寻找依赖对象。名称寻找依赖对象。 Resource(name=“personDaoBean”) private PersonDao personDao;/用于字段上用于字段上注意:如果没有指定注意:如果没有指定

50、name属性,并且按照默认的名称仍然找不到依赖对象时,属性,并且按照默认的名称仍然找不到依赖对象时, Resource注解会回退到注解会回退到按类型装配。但一旦指定了按类型装配。但一旦指定了name属性,就只能按名称装配了。属性,就只能按名称装配了。依赖注入依赖注入-手工装配-注解装配Autowiredpublic class Computer /计算机类计算机类 Autowired private USB usb; Autowired private Iprint print; Autowired private Memory memory; public void showHardWare

51、Info() usb.info(移动硬盘移动硬盘); print.info(彩色打印机彩色打印机); memory.info(金士顿内存条金士顿内存条);/不用再写不用再写set、get方法方法bean.xml配置配置! 不用再配置computerBean中引用的bean -Testpublic void getComputer()/模拟计算机组装测试方法模拟计算机组装测试方法 Computer computer = (Computer)context.getBean(computerBean); computer.showHardWareInfo();与xml配置文件中配置引用的Bean的区

52、别是:Computer Bean中不用再配置引用的Bean;这是优点;缺点是还是要在spring配置文件中配置uDisk,colorPrint,memory,computerBean这些Bean依赖注入依赖注入-手工装配-注解装配Resourcepublic class Computer private USB usb;private Iprint print;private Memory memory;public void showHardWareInfo() usb.info(移动硬盘移动硬盘); print.info(彩色打印机彩色打印机); memory.info(金士顿内存条金士顿

53、内存条);Resource(name=uDisk)public void setUsb(USB usb) this.usb = usb;Resource(name=colorPrint)public void setPrint(Iprint print) this.print = print;Resource(name=memory)public void setMemory(Memory memory) this.memory = memory; /不用再写不用再写set、get方法方法bean.xml配置配置!-不用再配置computerBean中引用的bean -Testpublic v

54、oid getComputer()/模拟计算机组装测试方法模拟计算机组装测试方法 Computer computer = (Computer)context.getBean(computerBean); computer.showHardWareInfo();与xml配置文件中配置引用的Bean的区别是:Computer Bean中不用再配置引用的Bean;这是优点;缺点是还是要在spring配置文件中配置uDisk,colorPrint,memory,computerBean这些Bean依赖注入依赖注入-自动装配依赖对象对于自动装配,大家了解一下就可以了,实在不推荐大家使用。例子:autow

55、ire属性取值如下:lbyType:按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的bean。如果发现多个,那么将会抛出异常。如果没有找到,即属性值为null。lbyName:按名称装配,可以根据属性的名称,在容器中寻找跟该属性名相同的bean,如果没有找到,即属性值为null。lconstructor与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。lautodetect:通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认

56、的构造器,那么将使用byType方式。通过在通过在classpathclasspath自动扫描方式把组件纳入自动扫描方式把组件纳入springspring容器中管理容器中管理前面的例子我们都是使用XML的bean定义来配置组件。在一个稍大的项目中,通常会有上百个组件,如果这些这组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了Component、Service、Controller、Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用b

57、ean节点配置组件是一样的。要使用自动扫描机制,我们需要打开以下配置信息: 其中base-package为需要扫描的包(含子包)。Service用于标注业务层组件、 Controller用于标注控制层组件(如struts中的action)、Repository用于标注数据访问组件,即DAO组件。而Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。自动扫描式注入自动扫描式注入Bean(Bean(优点:配置文件中不用再配置优点:配置文件中不用再配置bean)bean)/接口设计接口设计public interface USB /USB接口信息接口信息 public v

58、oid info(String content);public interface Iprint /打印机接口信息打印机接口信息 public void info(String content);Component(memory)public class Memory /内存类内存类 public void info(String config) System.out.println(内存配置:内存配置:+config); Component(computer)public class Computer /面向接口编程面向接口编程,下面的下面的 组件都是接口组件都是接口,不是类不是类Resou

59、rce(name=usb)private USB usb; Resource(name=colorPrint)private Iprint print; Resource(name=memory)private Memory memory; public void showHardWareInfo() usb.info(移动硬盘移动硬盘); print.info(彩色打印机彩色打印机); memory.info(金士顿内存条金士顿内存条);/上面的注解类也可以写在上面的注解类也可以写在set方法上面方法上面/不用再写不用再写set、get方法方法Spring配置文件配置配置文件配置Testpu

60、blic void getComputer() Computer computer = (Computer)context.getBean(computer); computer.showHardWareInfo();Component(value=usb)public class UDisk implements USB /接口实现类接口实现类 public void info(String config) System.out.println(usb接口配置:接口配置:+config); Component(colorPrint)public class ColorPrint implem

61、ents Iprint public void info(String config) System.out.println(彩色打印机:彩色打印机:+config); 静态代理/接口设计接口设计public interface Animal public abstract void eat(String food); public abstract String type();/AnimalWrapper类是包装类类是包装类(代理类代理类)public class AnimalWrapper private Animal animal; public AnimalWrapper(Animal

62、 animal) this.animal = animal;public void eat(String food) System.out.println(+Wrapped 前置通知前置通知!+); animal.eat(food); System.out.println(+Wrapped 后置通知后置通知!+);public String type() System.out.println(-Wrapped Before!-); String type = animal.type(); System.out.println(-Wrapped After!-); return type;pub

63、lic class Monkey implements Animal /接口实现类接口实现类 public String type() String type = 哺乳动物哺乳动物; System.out.println(type); return type; public void eat(String food) System.out.println(The food is+food+ !); Testpublic static void main(String args) AnimalWrapper wrapper = new AnimalWrapper(new Monkey(); wr

64、apper.eat(香蕉香蕉);静态代理的缺点前面我们通过包装的模式完成了对前面我们通过包装的模式完成了对Animal 所有子类所有子类的静态代理,在代理方法中,你可以加入一些自己的额外的静态代理,在代理方法中,你可以加入一些自己的额外的处理逻辑,就像上面的控制台输出语句一样。那么的处理逻辑,就像上面的控制台输出语句一样。那么Spring的前置、后置、环绕方法通知,通过这种方的前置、后置、环绕方法通知,通过这种方式可以有限的模拟出来,以式可以有限的模拟出来,以Spring 的声明式事务为的声明式事务为例,无非就是在调用包装的目标方法之前处开启事例,无非就是在调用包装的目标方法之前处开启事务,在

65、之后提交事务,这样原有的业务逻辑没有受到务,在之后提交事务,这样原有的业务逻辑没有受到任何事务管理代码的侵入。这种方式的静态代理,缺任何事务管理代码的侵入。这种方式的静态代理,缺点就是当点就是当Animal接口中增加了新的方法,那么包装接口中增加了新的方法,那么包装类中也必须增加这些新的方法。类中也必须增加这些新的方法。JDK动态代理public class public class JDKProxy JDKProxy implementsimplements InvocationHandlerInvocationHandler privateprivate ObjectObject targ

66、etObject targetObject;/;/要代理的目标对象要代理的目标对象publicpublic ObjectObject createProxyInstance( createProxyInstance(ObjectObject targetObject) targetObject)this.this.targetObject = targetObject;targetObject = targetObject;/* 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器* 第二个参数设置代理类实现的接口* 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法*/returnreturn ProxyProxy.newProxyInstance(.newProxyInstance(this.this.targetObject.getClass().getClassLoader(),targetObject.getClass().getClassLoader(),this.this.targetObject.getClass().

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!