💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## Visual Basic Visual Basic在搞组件化开发,它有一个可视化编辑器 只需要把一个组件(按钮)拖拽到表单上,设置一下属性(颜色),再添加一个事件,最后在onClick里面写点代码就可以了。 ## Java Bean API 定义了一套规范, 只要大家按照这个规范做, 谁都可以用 java 做出像 VB 那样的可视化开发工具出来 一个 java bean 其实就是一个普通的 java 类, 但我们对这个类有些要求 * 类是public的,然后需要有个无参数的构造函数 * 属性是private的,通过设置setXXX(),getXXX()来访问 * 能支持事件,例如 addXXXXListener(XXXEvent e), 事件可以是 Click 事件,Keyboard 事件等等 * 提供应该 反射机制,这样可以查看java bean的各种信息 * 可以序列化,可以保存在硬盘上 可以幻想一下, * 创建JButton 有个用户在用一个 Visual Java Builder 这样的可视化开发工具, 当他用这个工具创建应用的时候, 可以选择一个叫 JButton 的组件, 加到一个表单上 此时 Visual Java Builder 就需要把这 JButton 的类通过反射给 new 出来, 所以就需要一个无参数的构造函数了 * 设置属性 如果用户想去设置一下这个 JButton 的属性,Visual Java Builder 就需要先用自省 / 反射来获取这个 JButton 有哪些属性(通过 getter/setter), 拿到以后就可以给用户显示一个属性清单了, 例如背景色, 字体 等等。 用户看到后就可以设置背景色和字体了, 此时 Visual Java Builder 在内部就需要调用这个 Bean 的 setBackgroundCorlor()/setFont() 等方法, 这就是所谓的 setXXXX() 方法。 * 进行编程 如果用户想对这个 JButton 编程, Visual Java Builder 还是通过自省 / 反射来获取这个 JButton 有哪些事件, 给用户展示一个事件清单,例如 click , keyboardPressed 用户可以选取一个, 然后就可以写程序对这个事件编程了 ## JSP Model1 Java bean 的规范虽然定义的不错, 但却没有获得意料中的成功, 尤其是 Java 帝国所期待的桌面开发组件化市场上。 那么能不能把Java Bean用到服务器端呢? 可以用 java bean 来封装业务逻辑,保存数据到数据库, 像这样: ![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180815085834.png?picgo) 其中 jsp 直接用来接受用户的请求, 然后通过 java bean 来处理业务, 具体的使用方法是: ``` <jsp:useBean id="user"scope="page"class="com.coderising.User"/> <jsp:setProperty property="userName"name="user"param="userName"/> <jsp:setProperty property="password"name="user"param="password"/> ``` 这就能把 HTTP request 中的所有参数都设置到 user 这个 java bean 对应的属性上去。 如果想偷懒, 还可以这样: ``` <jsp:setProperty name="user"property="*"/> ``` 这个叫做 JSP Model 1 的模型受到了很多 Java 程序员的欢迎 , 因为他们的应用规模都很小, 用 Model 1 使得开发很快速。 实际上, 这种方式和微软帝国的 asp , 以及和开源的 php 几乎一样。 ## JSP Model2 系统中有好几千个 jsp, 这些 jsp 互相调用 (通过 GET/POST), 到了最后调用关系无人能搞懂。就想一碗面条,搅在一起,理不清楚 为了解决这个问题,小码哥又推出了 :JSP Model 2 , 这是个模型真正的体现了 Model-View-Controller 的思想: ![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180815090214.png?picgo) Servlet 充当 Controller , jsp 充当 View ,Java bean 当然就是 Model 了! 很多 Web 开发框架开始如雨后春笋一样出现, 其中最著名的就是 Struts, SpringMVC 了。 ## 企业级Java Bean 新的需求出现: * 分布式 * 安全 * 事务 * 高可用性 可以归结为: 程序员只想关注我们的业务逻辑, 我们不想, 也不应该由我们来处理‘低级’的事务, 多线程,连接池,以及其他各种各种的‘低级’API, 此外 Java 一定得提供集群功能, 这样我们的一台机器死机以后,整个系统还能运转。 ” 最终拿出了一个叫做 J2EE 的东西, 像 Java bean 一样, 这还是一个规范, 但是比 Java bean 复杂的多, 其中有: * JDBC:Java的数据库连接 * JNDI:Java命名和目录接口,通过一个名称可以定位到一个数据源 * RMI:远程过程调用,让一个机器上的Java对象可以调用另一个机器上的Java对象。 * JMS:Java消息服务,可以使用消息队列了。 * JTA:Java事务管理,支持分布式事务,可以在访问、更新多个数据库的时候保证事务的,而且还是分布式的。 * EJB:Java Bean变成了Enterprise Java Bean 使用了 EJB, 你就可以把精力只放在业务上了, 那些烦人的事务管理, 安全管理,线程 统统交给容器(应用服务器)来处理吧。 只要你的应用服务器是由多个机器组成的集群, EJB 就可以无缝的运行在这个集群上, 你完全不用考虑一个机器死掉了应用该怎么办。我们都帮你搞定了。 使用 Session Bean , 可以轻松的处理你的业务。 使用实体 Bean (Entity bean) , 你和数据库打交道会变得极为轻松, 甚至 sql 都不用写了。 使用消息驱动 Bean(Message Driven bean) , 你可以轻松的和一个消息队列连接, 处理消息。 Weblogic , Websphere 等符合 J2EE 规范的应用服务器趁势而上 ## Spring 程序员发现EJB用起来非常的繁琐和笨重,为了所谓的分布式,背上了沉重的枷锁。 实体 Bean 很快没人用了, 就连简单的无状态 Session bean 也被大家所诟病, 其中一条罪状就是 “代码的侵入性”。 在定义一个Session Bean的时候,需要写一堆与业务没有关系的类。还需要被迫实现一些根本不应该实现的接口及其方法: ![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180815090909.png?picgo) Spring 框架提供了一个Spring 容器来管理Bean 对于一个 Bean 来说,如果你依赖别的 Bean , 只需要声明即可, spring 容器负责把依赖的 bean 给 “注入进去 “, 起初大家称之为控制反转 (IoC) 后来 Martin flower 给这种方式起来个更好的名字,叫 “依赖注入”。 如果一个 Bean 需要一些像事务,日志,安全这样的通用的服务, 也是只需要声明即可, spring 容器在运行时能够动态的 “织入” 这些服务, 这叫 AOP