配色: 字号:
1#spring_ioc
2018-01-07 | 阅:  转:  |  分享 
  
------------------------------------------------2.0Spring应用动机整合资源整合we
b技术,提供一套MVC架构应用整合JDBC功能,提供一套数据持久化方案整合安全策略(例:shiro框架),提供一套权限控制方案整合
定时任务调度策略,提供一套任务调度方案定时任务调度,每隔一段时间的任务整合消息中间件JMS,提供一些高并发处理……回顾:Java中
的定时任务如何实现?(time,ScheduledExecutorService)CorecontainerBeansja
vaCoreContext访问资源,获取对象Spel以后企业应用中最基本的Core---ioc–AopWebJdbcor
m2.0spring架构图先了解如下几个部分IOC(控制反转)AOP(面向切面)WEB(WEB-MVC)ORM(对象关系
映射)2springcore2.1spring如何实现IOC控制反转Spring借助DI(依赖注入)的方式实现IOC(控
制反转)。Xml---dtd/schema文档约束创建对象的方式有哪些getBean重载的方法缓存结构一般都是key-va
lue形式对象之间的关系有哪些Isa继承Hasa关联–组合,聚合Usea元数据1)何为元数据?描述数据的数据2)J
ava中常用的元数据表示形式?(xml,注释)反射加元数据是实现通用型的一种手段通过Springbean容器实现IOC初始化并存
储对象,以及管理对象之间的依赖关系@@@课后作业:不用xml元数据的形式,使用基于注解方式实现工厂,并通过反射方式创建对象【造轮子
】:手动实现工厂容器1--xmlApplicationContext读取配置,动态创建对象[加载文件]//类路径获得类加载器,
src目录下所有的文件都会编译成class文件,是类路径,类路径下加载文件InputStreaminputStream=ge
tClass().getClassLoader().getResourceAsStream(file);[解析XML文件的方式]d
om4j,DOM解析,SAX,PULL,(SAXPULL占用内存小,适用于移动平台(安卓)使用)[反射]//通过反射,创建对象C
lassc1=Class.forName(className);Objectobject=c1.newInstance
();[异常处理]}catch(Exceptione){//解析文件失败之后,不需要让程序继续执行,因此抛出异常//加载类
创建对象失败之后,同样让程序停止thrownewRuntimeException(e);}finally{}[泛型]//<
T>写到方法的返回值左边时表示此方法为一个泛型方法,具体泛型的类型由相关参数类型决定//何为泛型?编译时的一种类型,运行时无效。
//应用场景?项目中的通用编程//泛型应用类型?项目中的通用编程//-----对通用模块进行抽取//运行时类型擦除这种方式以后经常
见到,当做为一个设计者的角度考虑问题的时候,运行这种方publicTgetBean(Stringkey,Class<
T>tClass){return(T)beanmap.get(key);}ArrayListlist=
newArrayList<>();List.add(“A”);//list.add(200);Classc=list
.getClass();Methodm=c.getDeclaredMethod(“add”,Object.class);//
执行方法m.invoke(list,200);System.out.println(list);【造轮子】:手动实现工厂容器2-
–注解思路:自定义bean工厂,扫描包内的含该注解的类,反射生成对象,放到map集合中---自定义元注解/@Retent
ion有效时期@Target应用位置/@Retention(value=RetentionPolicy.RU
NTIME)@Target(value=ElementType.TYPE)public@interfaceOoo{}--
-工厂类AnnoApplicationContext.javaClasscl=Class.forName(pkg+"."+f
ilename);//这里是以点间隔//有该注解修饰的才去构建这个对象if(cl.isAnnotationPresent(O
oo.class)){Objectobject=cl.newInstance();Stringkey=Charac
ter.toString(filename.charAt(0)).toLowerCase()+filename.substring
(1);map.put(key,object);}--Day022.2xml配置bean(1)对象的创建对象初始化的三种方式<
!--bean容器提供对象的几种方式<1>idclass通过类名反射出对象<2>idclassfactory-me
thod通过静态工厂,调用静态方法获取对象<3>idfactory-beanfactory-method通过实例工厂,
调用实例方法获取对象--><
!--<1>-->Instance"/>ethod="getTime"/>(2)对象的管理1-springbean的作用域scope--–singleton/prot
otypesingleton的情况应用的比较多(3)对象的管理2-springbean生命周期,创建与销毁singleton作
用域时--spring负责bean的生命周期(创建和销毁)。自动调用生命周期方法;prototype作用域时–sprin
g不管bean的生命周期。只在getbean时,创建对象,调用程序员定义的init方法,不负责对象的销毁;延时加载模式设置---
只对singleton有效(4)对象的关系:三种依赖注入方式--构造器注入--setter注入(必须有set方法,必须有默认
的无参构造器)--方法注入注入的属性类型:值、对象、数组、List、Map、Properties导入文件rtiesid=””location=””/>自动注入:byName--属于setter注入,如果有
属性是bean,那么依据setxxxx(intage)中set后的字符串来找需要注入的beanidbyType--属于set
ter注入,依据类型来注入,(若有注入类型的bean有两个,即定义了两个id,那么会编译报错)constructor--按构造器
参数类型注入,若类型相同的有两个,再找参数名noSpel表达式,注解2.3使用注解先要有个疑问,带着疑问看有哪些注解呢????注
解方式和xml方式的各自的优点缺点是什么呢????(1)对象的创建及管理-类注解conponentcontrollerser
vicerepository@conponent(“idg”)@Scope(“singleton”)注解方式的作用域设置@L
azy(value=true)注解方式的延迟加载设置(2)对象的关系-属性或方法注解@Autowired默认byType,可以加
@Qualifier("messageData")指定byName--属性--构造方法、普通方法上--属性@Autowire:优先
找本类无参构造创建对象,然后注入属性若类中存在无参构造:会使用无参构造创建对象,然后从容器中查找相应bean进行注入@Quali
fier("messageData")@AutowiredprivateMessageDatamessageData;publ
icMessageServiceImpl(){System.out.println("无参");//调用无参构造}publ
icMessageServiceImpl(MessageDatamessageData){this.messageData
=messageData;System.out.println("有参");}若类中只有有参构造:才使用有参构造注入(并且此
时属性上的@Autowired可以省略)@Qualifier("messageData")@AutowiredprivateMe
ssageDatamessageData;publicMessageServiceImpl(MessageDatamessa
geData){this.messageData=messageData;System.out.println("有参"
);}--在构造方法上/在普通方法上使用@Autowire@AutowiredpublicMessageServiceImpl(
@Qualifier("messageData")MessageDatamessageData){this.message
Data=messageData;System.out.println("有参");}@Resource默认ByName,
假如没找到,按ByType用在属性、set方法上!!用在属性上,并且用在set方法上,set方法执行只用在属性上,set方法不执行
只用在set方法上,set方法执行@Value可以接spel表达式@value(“#{cfg.prefix}”)privateS
tringprefix;@value(“#{cfg.sufix}”)privateStringsufix;(3)注解声明-b
ean生命周期方法/@PostConstruct修饰方法在对象构建以后执行(初始化对象)/@PostConstru
ctpublicvoidinit(){//将一个线程不安全的map转换为线程安全的mapmap=Collections.syn
chronizedMap(map);//从性能上讲不如ConcurrentHashMap性能高System.out.println
("init()");}/@PreDestroy注解修饰的方法在对象销毁之前执行(销毁对象资源)/@PreDestro
ypublicvoiddestory(){System.out.println("destory");map.clear();
map=null;}(4)!!!xml和注解方式的优缺点xml配置方式:优点-代码侵入性小,缺点是灵活性不好注解配置方式:优点灵活
性比较好,缺点是存在一定的代码侵入性,但是这种侵入性属于声明式侵入性,这种侵入性在程序中是允许,它属于弱侵入性作业1:Point
点Circle圆—点2.4IOC的优点:!!!通过项目uml图理解spring容器IOC的好处···(1)手动new对象生成依赖
,使用者依赖于其它接口及其实现类,uml类图如下所示,耦合度高···(2)使用spring容器,将对象的创建过程交给IOC容器来处
理,uml类图如下所示,耦合度非常小后续-AOP………代理模式静态代理–动态代理JDK/CGLIBAOP配置--切面、切入点
、通知-----------------------------------------问题:spring中如何优化对对象的使用?//1)单例设计//2)延迟加载---!!!!一般在大对象(占用内存较多的对象)时使用延迟加载!!!问题:AOP的核心是什么?围绕核心展开知识点!!!!!!问题:事务由谁开启,由谁关闭呢。连接在哪里关呢??问题:在不修改原有代码的基础,如何添加新的功能?扩展完全不用xml的基于注解bean容器@ComponentScan@EnableAspectJAutoProxyclassAppCfg{}AnnotationApplicationContextapplicationContext=newAnnotationApplicationContext(AppCfg.class);
献花(0)
+1
(本文系金银宝100首藏)