丰富的线上&线下活动,深入探索云世界
做任务,得社区积分和周边
最真实的开发者用云体验
让每位学生受益于普惠算力
让创作激发创新
资深技术专家手把手带教
遇见技术追梦人
技术交流,直击现场
海量开发者使用工具、手册,免费下载
极速、全面、稳定、安全的开源镜像
开发手册、白皮书、案例集等实战精华
为开发者定制的Chrome浏览器插件
EJB
Spring架构由诸多模块组成,可分类为
反转了依赖关系的满足方式,由之前的自己创建依赖对象,变为由工厂推送。(变主动为被动,即反转)
解决了具有依赖关系的组件之间的强耦合,使得项目形态更加稳健
publicclassUserDAOImplimplementsUserDAO{....}publicclassUserServiceImplimplementsUserService{//!!!强耦合了UserDAOImpl!!!,使得UserServiceImpl变得不稳健!!privateUserDAOuserDAO=newUserDAOImpl();@OverridepublicUserqueryUser(){returnuserDAO.queryUser();}....}9.2解决方案//不引用任何一个具体的组件(实现类),在需要其他组件的位置预留存取值入口(set/get)publicclassUserServiceImplimplementsUserService{//!!!不再耦合任何DAO实现!!!,消除不稳健因素!!privateUserDAOuserDAO;//为userDAO定义set/get,允许userDAO属性接收spring赋值//GettersAndSetters@OverridepublicUserqueryUser(){returnuserDAO.queryUser();}....}
三种属性注入方式:
各种注入属性:
对象
importjavax.annotation.PostConstruct;importjavax.annotation.PreDestroy;@PostConstruct//初始化publicvoidinit(){System.out.println("initmethodexecuted");}@PreDestroy//销毁publicvoiddestroy(){System.out.println("destroymethodexecuted");}12.4生命周期阶段单例bean:singleton随工厂启动[创建]()==》[构造方法]()==》[set方法(注入值)]()==》[init(初始化)]()==》[构建完成]()==》[随工厂关闭销毁]()
多例bean:prototype
被使用时[创建]()==》[构造方法]()==》[set方法(注入值)]()==》[init(初始化)]()==》[构建完成]()==》[JVM垃圾回收销毁]()
静态代理的问题
有两种实现方式:
//目标finalOrderServiceos=newOrderServiceImpl();//额外功能InvocationHandlerhandler=newInvocationHandler(){//1.设置回调函数(额外功能代码)@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println("start...");method.invoke(os,args);System.out.println("end...");returnnull;}};//2.创建动态代理类ObjectproxyObj=Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHandler);13.3.2CGlib动态代理实现(基于继承)finalOrderServiceos=newOrderServiceImpl();Enhancercnh=newEnhancer();//1.创建字节码曾强对象enh.setSuperclass(os.getClass());//2.设置父类(等价于实现原始类接口)enh.setCallback(newInvocationHandler(){//3.设置回调函数(额外功能代码)@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println("start...");Objectret=method.invoke(os,args);System.out.println("end...");returnret;}});OrderServiceproxy=(OrderService)enh.create();//4.创建动态代理类proxy,createOrder();十四、面向切面编程【重点】AOP的实现:
例如:UserDAO==>userDAO,OrderDAO==>orderDAO
当涉及到事务嵌套(Service调用Service)时,可以设置:
readonly读写性
当前事务所需操作的数据被其他事务占用,则等待。
rollback-for回滚属性
@ServicepublicclassUserServiceImplimplementsUserService{@Autowired//注入类型为UserDAO的bean@Qualifier("userDAO2")//如果有多个类型为UserDAO的bean,可以用此注解从中挑选一个privateUserDAOuserDAO;}@ServicepublicclassUserServiceImplimplementsUserService{@Resource("userDAO3")//注入id=“userDAO3”的beanprivateUserDAOuserDAO;/*@Resource//注入id=“userDAO”的beanprivateUserDAOuserDAO;*/}publicclassXX{@Value("100")//注入数字privateIntegerid;@Value("shine")//注入StringprivateStringname;}