㈠ Spring Boot的优缺点是什么
任何技术都是有优缺点的,没有银弹,解决一切问题,不留任何小尾巴
SpringBoot优点概括起来就是简化:简化编码,简化配置,简化部署,简化监控,简化依赖坐标导入,简化整合其他技术....
SpringBoot的缺点是入门简单精通难,各种强大的功能封装的太好了,内部原理比较难得参透!再就是用多了容易产生依赖,就像嗑药似的,用了就离不开了;SpringBoot一旦出了错误,由于内部封装比较深,部分错误调试难度比一般Spring应用程序要大很多!
当然完全不必纠结与SpringBoot的缺点,毕竟SpringBoot的有点太突出了,Spring早就是Java编程语言中,实际意义上的"老大"人尽皆知,而Spring的开发团队Pivotal,又将SpringBoot造了出来,那么其地位更加稳固!尽快入坑吧,不然会被时代的小火车,远远甩在屁股后~怎么,学不下去,就去黑马程序员官网视频库看免费视频。
㈡ spring+mybatis的优缺点
mybatis的优缺点:
优点:
1.易于上手和掌握。
2.sql写在xml里,便于统一管理和优化。
3.解除sql与程序代码的耦合。
4.提供映射标签,支持对象与数据库的orm字段关系映射
5.提供对象关系映射标签,支持对象关系组建维护
6.提供xml标签,支持编写动态sql。
缺点:
1.sql工作量很大,尤其是字段多、关联表多时,更是如此。
2.sql依赖于数据库,导致数据库移植性差。
3.由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
4.字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)
5.DAO层过于简单,对象组装的工作量较大。
6.不支持级联更新、级联删除。
7.编写动态sql时,不方便调试,尤其逻辑复杂时。
8提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。
9.使用不当,容易导致N+1的sql性能问题。
10.使用不当,关联查询时容易产生分页bug。
11.若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
12.参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)
13.多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)
14.缓存使用不当,容易产生脏数据。
总结:
mybatis的优点其实也是mybatis的缺点,正因为mybatis使用简单,数据的可靠性、完整性的瓶颈便更多依赖于程序员对sql的使用水平上了。sql写在xml里,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限,无法像jdbc那样在代码里根据逻辑实现复杂动态sql拼接。mybatis简单看就是提供了字段映射和对象关系映射的jdbc,省去了数据赋值到对象的步骤而已,除此以外并无太多作为,不要把它想象成hibernate那样强大,简单小巧易用上手,方便浏览修改sql就是它最大的优点了。
mybatis适用于小型且程序员能力较低的项目和人群使用,对于中大型项目来说我并不推荐使用,如果觉得hibernate效率低的话(实际上也是使用不当所致,hibernate是实际上是不适用于拥有高负载的工程项目),还不如直接用spring提供的jdbc简单框架(Template),同样支持对象映射。
spring的优缺点:
优点
a.Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的API特制的framework,
Spring致力于解决剩下的问题。
b.Spring能消除在许多工程中常见的对Singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对
象的程度。
c.通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。曾经对某个类
要寻找的是哪个魔法般的属性项或系统属性感到不解,为此不得不去读Javadoc甚至源编码?有了Spring,你仅仅需要看看类的JavaBean属性
。InversionofControl的使用(在下面讨论)帮助完成了这种简化。
d.?通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯。
e.Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
f.使用Spring构建的应用程序易于单元测试。
g.Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或localEJBs来实现业务接口,却不会影响
调用代码。
h.Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适用于许多web应用。例如,Spring能使用AOP提
供声明性事务管理而不通过EJB容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个JTA实现。
i.Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/Rmapping产品(如Hibernate)。
Spring确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。
缺点:使用人数不多、jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器
以上内容,是我在网络上找到的,希望对你有帮助~~
㈢ spring ioc依赖注入有几种 每种区别,优缺点
spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控制什么?依赖注入和控制反转是一样的概念吗?接触新的知识,小编的脑袋中全是大大的问号,不过没有关系,今天这篇博文,小编主要来简单的介绍一下在spring IOC中依赖注入的方法。
依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性。我们可以从以下几个方面理解:
a、参与者都有谁?
b、依赖:谁依赖谁?为什么需要依赖?
c、注入:谁注入谁?又注入了什么呢?
d、控制反转:谁控制谁?控制什么?为什么叫反转呢?存在正转吗?
e、控制反转和依赖注入是同一个概念吗?我们需要弄明白上面的问题,这样对于控制反转和依赖注入的理解有大大的帮助。
首先:第一个问题,参与者都有谁?
1)对象
2)IOC/DI容器
3)某个对象的外部资源
第二问题:依赖,谁依赖谁?为什么需要依赖?
依赖嘛,很好理解的,对象依赖于IOC/DI容器,至于为什么要依赖呢?对象需要IOC/DI容器来提供对象需要的外部资源。
第三个问题:注入,谁注入谁?又注入了什么呢?
显而易见是IOC/DI容器注入对象,注入了what呢?肯定注入的是某个需要的东西那就是注入对象所需要的资源,肯定不会注入无关紧要的内容,你说呢?
第四个问题:控制反转,谁控制谁?控制什么?为什么叫反转呢?存在正转吗?
控制反转,控制什么?肯定是IOC/DI容器控制对象,主要是控制对象实例的创建,反转是相对于正向而言的,那么什么算是正向的呢?考虑一下常规情况下的应用程序,如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中。
第五个问题:控制反转和依赖注入式同一个概念吗?
依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。
了解了这些基本的概念,弄明白她们之间的联系和区别,能够帮助我们更好的理解,接着小编来重点介绍一下依赖注入,在spring ioc中有三种依赖注入,分别是:
a、接口注入;
b、setter方法注入;
c、构造方法注入;
接着小编对这三种注入方式一一进行讲解,通过demo的讲解,希望能够帮助小伙伴们更好的理解,不足之处还请多多指教。
接口注入
publicclassClassA{
privateInterfaceBclzB;
publicvoiddoSomething(){
Ojbectobj=Class.forName(Config.BImplementation).newInstance();
clzB=(InterfaceB)obj;
clzB.doIt();
}
……
}
解释一下上述的代码部分,ClassA依赖于InterfaceB的实现,我们如何获得InterfaceB的实现实例呢?传统的方法是在代码中创建 InterfaceB实现类的实例,并将赋予clzB.这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码。我们根据预先在配置文件中设定的实现类的类名(Config.BImplementation),动态加载实现类,并通过InterfaceB强制转型后为ClassA所用,这就是接口注入的一个最原始的雏形。
setter方法注入
setter注入模式在实际开发中有非常广泛的应用,setter方法更加直观,我们来看一下spring的配置文件:
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
<!--使用spring管理对象的创建,还有对象的依赖关系-->
<beanid="userDao4Mysql"class="com.tgb.spring..UserDao4MysqlImpl"/>
<beanid="userDao4Oracle"class="com.tgb.spring..UserDao4OracleImpl"/>
<beanid="userManager"class="com.tgb.spring.manager.UserManagerImpl">
<!--(1)userManager使用了userDao,Ioc是自动创建相应的UserDao实现,都是由容器管理-->
<!--(2)在UserManager中提供构造函数,让spring将UserDao实现注入(DI)过来-->
<!--(3)让spring管理我们对象的创建和依赖关系,必须将依赖关系配置到spring的核心配置文件中-->
<propertyname="userDao"ref="userDao4Oracle"></property>
</bean>
</beans>
接着我们来看一下,setter表示依赖关系的写法
importcom.tgb.spring..UserDao;
{
privateUserDaouserDao;
//使用设值方式赋值
publicvoidsetUserDao(UserDaouserDao){
this.userDao=userDao;
}
@Override
publicvoidaddUser(StringuserName,Stringpassword){
userDao.addUser(userName,password);
}
}
构造器注入
构造器注入,即通过构造函数完成依赖关系的设定。我们看一下spring的配置文件:
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
<!--使用spring管理对象的创建,还有对象的依赖关系-->
<beanid="userDao4Mysql"class="com.tgb.spring..UserDao4MysqlImpl"/>
<beanid="userDao4Oracle"class="com.tgb.spring..UserDao4OracleImpl"/>
<beanid="userManager"class="com.tgb.spring.manager.UserManagerImpl">
<!--(1)userManager使用了userDao,Ioc是自动创建相应的UserDao实现,都是由容器管理-->
<!--(2)在UserManager中提供构造函数,让spring将UserDao实现注入(DI)过来-->
<!--(3)让spring管理我们对象的创建和依赖关系,必须将依赖关系配置到spring的核心配置文件中-->
<constructor-argref="userDao4Oracle"/>
</bean>
</beans>
我们再来看一下,构造器表示依赖关系的写法,代码如下所示:
importcom.tgb.spring..UserDao;
{
privateUserDaouserDao;
//使用构造方式赋值
publicUserManagerImpl(UserDaouserDao){
this.userDao=userDao;
}
@Override
publicvoidaddUser(StringuserName,Stringpassword){
userDao.addUser(userName,password);
}
}
接口注入 && setter注入 && 构造器注入
接口注入:
接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。
Setter 注入:
对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。
构造器注入:
在构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。
㈣ spring 是java编程中啊哪类软件 有什么优缺点
在SSH框假中spring充当了管理容器的角色,Spring 可以大大降低耦合。
首先耦合说白了就是类(也可以大到功能)与类之间的关联程度,关联越大,你的维护成本就越高,因为你改其中一个类,就很可能要去改和它关联的其他类,所以在设计的时候需要考虑清楚,尽量做到松散耦合,这时候就需要Spring了。
struts负责控制Service(业务逻辑处理类)也就是C,从而控制了Service的生命周期,这样层与层之间的依赖很强,属于耦合。这时,使用spring框架就起到了控制Action对象(Strus中的)和Service类的作用,两者之间的关系就松散了,Spring的Ioc机制(控制反转和依赖注入)正是用在此处。
Spring的Ioc(控制反转和依赖注入)
控制反转:就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控
依赖注入:组件之间的依赖关系由容器在运行期决定 ,由容器动态的将某种依赖关系注入到组件之中 。
从上面我们不难看出:从头到尾Action仅仅是充当了Service的控制工具,这些具体的业务方法是怎样实现的,他根本就不会管,也不会问,他只要知道这些业务实现类所提供的方法接口就可以了。而在以往单独使用Struts框架的时候,所有的业务方法类的生命周期,甚至是一些业务流程都是由Action来控制的。层与层之间耦合性太紧密了,既降低了数据访问的效率又使业务逻辑看起来很复杂,代码量也很多。,Spring容器控制所有Action对象和业务逻辑类的生命周期,由于上层不再控制下层的生命周期,层与层之间实现了完全脱耦,使程序运行起来效率更高,维护起来也方便。
使用Spring的第二个好处(AOP应用): 这个不太理解。
事务的处理:
在以往的JDBCTemplate中事务提交成功,异常处理都是通过Try/Catch 来完成,而在Spring中。Spring容器集成了TransactionTemplate,她封装了所有对事务处理的功能,包括异常时事务回滚,操作成功时数据提交等复杂业务功能。这都是由Spring容器来管理,大大减少了程序员的代码量,也对事务有了很好的管理控制。Hibernate中也有对事务的管理,hibernate中事务管理是通过SessionFactory创建和维护Session来完成。而Spring对SessionFactory配置也进行了整合,不需要在通过hibernate.cfg.xml来对SessionaFactory进行设定。这样的话就可以很好的利用Sping对事务管理强大功能。避免了每次对数据操作都要现获得Session实例来启动事务/提交/回滚事务还有繁琐的Try/Catch操作。这些也就是Spring中的AOP(面向切面编程)机制很好的应用。一方面使开发业务逻辑更清晰、专业分工更加容易进行。另一方面就是应用Spirng AOP隔离降低了程序的耦合性使我们可以在不同的应用中将各个切面结合起来使用大大提高了代码重用度 。
对Spring好处的简单理解
㈤ 请说说Sping和EJB各自的优缺点吧
1.spring 和 EJB 有什么可比之处?
Spring和EJB都是两种Java领域模型(框架),当然有很多不同,其实比不需要关注两者的不同,以及可比之处,如果客户要求你使用EJB,你就用EJB,要你用Spring,你就用Spring。不用不需要知道,因为知道了没好处。如果客户没有要求,建议你用Spring,更加敏捷,它的依赖注入可以让它跟其它任何框架无耦合的组合。
所谓轻量级,就是它对容器(如sevlet容器或Ejb容器)的依赖更小,并不表示它的性能和功能比重量级的差,很多服务器中没有包含Ejb容器。
2. spring 能支持分布式吗?
分布式很大一部分依赖的是容器。Java本身就有支持分布式的特性。与具体框架无关。所以如果你的程序设计成分布式的,那就是分布式的,不管你用srping,还是Ejb,或者两个都用
3.分布式具体怎么描述的?
所谓分布式,就是一个系统的多个服务在不同的域上。举个例子,你登录了sohu之后,可以访问chinaren而不需要重新登录,但sohu和chianren是两个不同的域,你把这一整个看成一个大系统,那么两个域中的子系统就是分布式的服务。有一种叫单点登录的技术能够让你跨域访问多个子应用,而不需要从新登录。
还有一种分布式是为了控制大量的并发访问,你访问sohu,其实有可能访问的并非总是同一个服务器,它可能是多个服务器提供完全相同内容的系统,在这些系统的前端,有个提供负载均衡的系统引导你去访问当前负荷较小的服务器。
3.EJB 到底有什么好处
这个问题很奇怪,每个框架都要它的特点。但你需要什么,当它能满足你,你就去用它嘛。你当然有权利决定使用其它的事务管理机制来替代EJB的,比如spring的申明式事务。你要做的就是把系统做出来,老板不会关心你的技术细节。
如果实在不知道是要用EJB或者Spring(如果两者的了解程度相当),就抓阄决定吧,o(∩_∩)o...。
4.JMS 和事务管理,什么时候才用得上? 我开发了那么多系统.从来没碰过!
JMS没用过有可能,因为大部分J2EE都是单服务的web应用。不需要通过JMS提供底层系统内部通信。但事务!!!,任何一个有CURD的系统都该有的呀,否则如何保证数据的安全呢?
比如你有两个操作,先添加一条记录,紧接着修改这条记录,当你第一个操作执行完了,第二个操作出异常了,这两个操作是一件事,把它套在一个事务里,第一个操作就算成功了,也会被回滚,因为它整体是失败的。没有事务,事情就只做了一半,就会多出一条错误数据。
㈥ Spring框架自动装配的局限性是什么,有
w行路难(李白)
㈦ springboot自动装配原理面试回答是什么
SpringBoott自动装配原理主要解决了传统spring的重量级xml配置Bean.实现了自动装配;所以,我们也常在面试中被问到SpringBoot是如何实现自动装配。
springboo的介绍
SpringBoot基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。
另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。SpringBoot框架中还有两个非常重要的策略:开箱即用和约定优于配置,开箱即用,Outofbox,是指在开发过程中。
通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。
这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。约定优于配置,Convention over configuration,是一种由SpringBoot本身来配置目标结构。
㈧ spring3.0 两种事务配置的优缺点比较
基于XML 的方式 优点:可以再后期维护的时候适当的调整事务管理模式,并且只要遵循一定的命名规范,可以让程序员不必关心事物。但是缺点是不容易理解,配置容易失误,并且需要一个听话的团队。
基于注解方式 配置比较方便,程序员只要在service层代码设置即可实现。缺点就是后期调整很烦,基本上调整事物的话会死。
㈨ 2.Spring Boot的优缺点是什么
任何技术都是有优缺点的,没有银弹,解决一切问题,不留任何小尾巴
SpringBoot优点概括起来就是简化:简化编码,简化配置,简化部署,简化监控,简化依赖坐标导入,简化整合其他技术....
SpringBoot的缺点是入门简单精通难,各种强大的功能封装的太好了,内部原理比较难得参透!再就是用多了容易产生依赖,就像嗑药似的,用了就离不开了;SpringBoot一旦出了错误,由于内部封装比较深,部分错误调试难度比一般Spring应用程序要大很多!
当然完全不必纠结与SpringBoot的缺点,毕竟SpringBoot的有点太突出了,Spring早就是Java编程语言中,实际意义上的"老大"人尽皆知,而Spring的开发团队Pivotal,又将SpringBoot造了出来,那么其地位更加稳固!尽快入坑吧,不然会被时代的小火车,远远甩在屁股后~怎么,学不下去,黑马程序员教程视频资源官网都免费发布,直接去学就行了。
㈩ spring自动装配是什么意思
spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自
动让Spring通过检查BeanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean)。由于
autowire可以针对单个bean进行设置,因此可以让有些bean使用autowire,有些bean不采用。autowire的
方便之处在减少或者消除属性或构造器参数的设置,这样可以给我们的配置文件减减肥