Java学习篇——Spring中的IOC和AOP(建议去了解反射、Xml、23中设计模式,MVC设计)

Spring是什么?

  • 学习之前 自己在idea中新建一个md文档      (记录   ——xml依赖  记录——注解)
  • Web开发中的一阵春风,解决任何java应用开发
  • 2002年 interface21  Spring前身。2004年Spring出现
  • 概念:一个开源免费的、轻量级的控制反转和面向切面的框架


  • 优点:

    • 1、开源免费
    • 2、轻量级(只需要加依赖就行),非侵入性(不用更改业务源代码)
    • 3、控制反转和面向切面
    • 4、支持对事务的操作,对框架整合的支持
  • 缺点:

    • 体系庞大。配置大多。

包含  7大模块  :Spring的七大模块,以及每个模块的作用_Lilia_T的博客-CSDN博客_spring七大模块

IOC:控制反转

ioc是一种编程思想:将主动编程变为被动接受。 对象的 交给Spring创建   管理  装配。

控制:谁来控制对象的创建,传统的程序的对象时由程序本身来创建,使用Spring时,对象由Spring创建。

反转:程序本身不创建对象,而变成被动接受对象。

依赖注入:使用set方法注入属性值


Spring怎么创建对象

        1、XML文件(Bean标签)

        2、注解    (5个注解)

Spring 依赖注入:

        1、xml  (bean标签的其他属性   两种 set  构造器注入 )

        2、继基于接口的注解注入 
问题:有几种注入方式?3种

先创建Maven工程,在配置文件中加入依赖。Spring——web MVC   使用MVC是一次性的加载多个依赖。 (后面项目可以使用创建spring工程)


1、XML文件的方式


怎们创建对象????????????


*****实现过程——反射:  找XML文件,拆解XML文件,反射创建,交给Spring容器管理。
 

官方的创建对象学习地址:

Core Technologies

Spring 配置包含容器必须管理的至少一个,通常是多个 bean 定义。基于 XML 的配置元数据将这些 bean 配置为<bean/>顶级元素内的<beans/>元素。

自定义XML文件将以下代码赋值进入,将官方定义的<bean>删除  使用自己想建立的对象。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="..." class="...">  
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here -->

</beans>

java代码  main方法中   获取配置文件的类对象。   

作用:加载Spring  xml文件中的Bean    可以写多个xml文件。

ApplicationContext context = 
new ClassPathXmlApplicationContext("services.xml", "daos.xml");
  • 自定义对象时需要有自己的类,spring中也有自己的一些对象。
自定义类
public class user {
    private String username;
    
    user(){
    username=“nihao”
    }

    //get set  方法
}

  • 创建对象默认无参构造方法创建(官方还有其他方法创建可以去官方网址参考)  类属性赋值必须有 set方法
  • 有参构造创建对象时:根据参数顺序创建、根据参数类型创建、根据参数名称创建
  • set方法注入下面说


对象创建的时机:?????????获取  (xml文件)上下文的时候


获取对象:getBean()




xml文件的配置  标签:

        <alias/>别名

     

<alias name="fromName" alias="toName"/>
name:bean的id    alias:bean的别名   获取的时候用

        <bean> 创建对象
 

<bean id="exampleBean" class="examples.ExampleBean"/ name=" a, b ,c" scope="">
name :也是别名   可以写多个    
scope:作用域:默认单例

更多属性  自己查看

<import>导入其他xml   resources里面写路径。




 




依赖注入:

DI  依赖注入是IOC 的实现  办法。

依赖:创建对象的过程依赖于 Spring容器

注入:对象的属性 通过Spring容器注入。

官方解释:

        依赖  对象的属性

        注入:创建对象时将属性注入赋值

构造器注入(上面已说)、set注入、拓展注入


set注入

被创建对象时注入属性的类———— 

—— Set注入根据属性名注入

普通值注入

<bean id="xiaoming" class="cn.zhangyongqi.user">
<property name="zhang"  value="good">
</bean>

根据属性名字 注入。

bean注入  Address自定义的类型   下面赋值给Address创建对象 ,上面将对象注入给Student类的属性。——(自动装配的前身  现在是主动装配,)

bean注入  数组类型

bean注入  list类型

 bean注入  Map类型

  bean注入  Set类型

 bean  null值注入

 bean  proerties类型注入


拓展注入:cp命名空间注入

  • p对应set
  • c对应构造器


p  先导入  p命名空间的依赖项    property

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"      p命名的依赖性
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    
    <bean name="classic" class="com.example.ExampleBean">
        <property name="email" value="someone@somewhere.com"/>
    </bean>

    两种注入的属性值  效果相同
    <bean name="p-namespace" class="com.example.ExampleBean"
        p:email="someone@somewhere.com"/>
</beans>

c 命名空间,先导入依赖项  c:会出现构造器参数出现   constructor

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
c命名空间的依赖项    
xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="beanTwo" class="x.y.ThingTwo"/>
    <bean id="beanThree" class="x.y.ThingThree"/>

    <!-- traditional declaration with optional argument names -->
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg name="thingTwo" ref="beanTwo"/>
        <constructor-arg name="thingThree" ref="beanThree"/>
        <constructor-arg name="email" value="something@somewhere.com"/>
    </bean>
    两种注入方法效果相同  下面更方便。
    <!-- c-namespace declaration with argument names -->
    <bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
        c:thingThree-ref="beanThree" c:email="something@somewhere.com"/>

</beans>


作用域:Scope           

(作用域是什么意思,单例原型 是什么     23种设计模式【狂神说Java】单例模式-23种设计模式系列_哔哩哔哩_bilibili

*****

默认单例的,怎么取都只有一个相同对象。

<bean id="accountService" class="com.something.DefaultAccountService"/>

<!-- the following is equivalent, though redundant (singleton scope is the default) -->
<bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>



加标签
scope="singleton"

原型的:

<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>

原型
scope="prototype"

其余的在web应用里面使用。.....(先不聊了)


基于XML的自动装配

  •  自动注入是Spring满足bean依赖的一中方式
  • Spring会在上下文中寻找,并给bean装配属性

Spring中有三种装配模式

  • xml中的显示配置  、(显示是直接给值上面的set注入  隐式是去找值)
  • java中的显示配置    (直接给值)
  • 隐式的自动装配bean配置  *****



xml的隐式装配***************************byName  —— byType

spring加载3个类  得到3个对象  人 狗 猫     人类中有猫和狗的属性     下面主动为属性注入了。

——byName 根据Spring容器中的bean ID去找  和需要装配的属性(set方法注入)的名称。

——byType  根据Spring容器中的bean ID去找  和需要装配属性类型。


使用注解实现自动装配

Core Technologies


使用注解须知

        导入约束

        配置注解支持

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    

xmlns:context="http://www.springframework.org/schema/context"
    
约束
xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    注解支持
<context:annotation-config/>

</beans>

@AutoWired  默认byType  类型注入  找不到根据byName(bean id) (required 两个值   true自动装配   false放弃自动装配 )

@Resource  根据名称再根据类型
当需要创建某个类的对象到Spring容器里面时,给对象的属性赋值时将@AutoWired注解在类属性上。

也可用在set方法上  一样的赋值。

用在属性上时可以没有Set方法。(反射  暴力注入)   ——(题外话:Lombok注解可以不写set get方法)

@Qualifier(value=“bean的id名”) 一般写在@AutoWired的下面   表示类型找不到按beanid找。

@Nullable  注解    用在构造器注入时  可以允许null


2、使用注解(装配对象)实现开发:

Spring4之后使用注解 

****配置bean需要 导aop的包  上面导依赖时已经包含了。

****需要注解支持的标签 

 

——使用XML扫描。
加标签

扫描根包下的bean   带了组件注解的类才能扫描。
<context:component-scan base-package="cn.te.zhang.entity">

组件注解  加在类上。

  •        @Componet:组件的意思——通用加载bean的注解
    • @Service:用在业务类上
    • @Controller:控制器上
    • @Repository: 数据存取类    (DAO)


——使用  纯java类  扫描配置对象。

    • 另外后面会用到不用XML配置,在类上使用@Configuration  表示他是配置类。
    • 两种实现形式。     将类作为容器     将包作为容器
    • 将类作为容器:加了@bean注解的方法的返回值就是对象   @bean注解可以更改bean的默认名字(方法名),获取bean时就是根据方法名去掉get 获取。前提是User类加了组件注解   类比xml返回值为bean标签的class 属性   方法名相当于 id属性。
    • 将包作为容器:  配置类就是当加载此类时 ,工作将包下的加了注解主键的类放到容器里面。
    • @ComponentScan(根包:要加载进Spring容器里面的)  ,加载配置类时就会扫描加载根包下的类。
    • @Configuration    配置类注解
      @ComponentScan({"cn.tedu.spring","java"})  扫描注解
      @import(类/包)           导入其他配置类注解
         
      public class xxxconfig(){
          
      }

    • 配置类  一般命名使用xxx+config



AOP:面向切面编程


先讲代理模式:(23设计模式)

        AOP的底层就是代理模式的实现

        什么是代理模式?  需要某些代理对象帮助完成某些事。

        分类

                静态代理:一个代理对象对应一个真实对象

                动态代理:

 



静态代理


例子详解:

 角色分析:

        抽象角色:(接口或抽象类实现)这里为出租行为   

        真实对象:房东   被代理的角色

        代理对象:代理真实对象的一些操作,再加自己的附属操作

        客户:         访问代理对象的人

代码实现:

抽象角色  出租

真实角色    房东   被代理的角色   要实现抽象对象  出租行为

代理角色:中介    也要实现抽象对象  重写出租行为时  使用房东 的出租行为。 

客户:  用户租房的人。   为什么直接new 了房东 ?演示 ,,  实际可用反射注入到代理的构造方法中

 

代理对象脱离 真实对象  可以自己添加行为   (service  层的行为 )不用改变真实对象

还是调用  rent方法时  结果不同

 

 

优点:

        可以使真实角色更加存粹

        公共业务交给代理实现

        公共业务发生扩展更加方便管理

缺点:

        一个真实对象需要new一个代理对象

动态代理:

        1、与静态代理的角色一样

        2、代理关系不是写死的   一对一的,根据传入改变,代理角色动态生成

        3、分类:

                基于接口 : jdk   

                基于类 :   cglib(了解jvm比较麻烦)

                字节码:   javasist

需要了解两个类(为生成代理对象执行方法。)

        Proxy   代理对象

        InvocationHandle   调用处理的接口

InvocationHandle 源码说明文档   

 invoke方法 (代理对象调用真实对象时会利用反射机制调用此方法。)

参数:[ 代理的对象   方法对象 (代理对象执行的方法)  方法参数   (前面方法的参数,因为有重载 ,根据参数判定执行哪一个) ] 反射实现。  

Proxy 的源码说明文档

 里面有一个静态方法可以生成代理对象(可以不强转   直接用Object接受)

参数:   (真实角色的类路径      抽象角色(出租行为)   执行invoke方法的对象)

 

代码实现动态代理:

       

下面为生成代理对象和执行方法的工具类   为什么写?   将方法封装。不然每次使用前得

用匿名内部类创建一个执行invoke方法的对象(实现InvocationHandle接口,等下传到Proxy静态方法的参数里面)。

使用Proxy静态方法得到代理对象,代理对象会使用匿名内部类的重写的invoke方法

创建一个 工具类

上述静态代理的         出租rent接口  和真实角色 房东HOst不变(那两个类或接口不变)

客户   用户、

好处:

        包含静态代理的好处

        一个动态代理类可以代理 一个接口(一般 表示某些行为业务)

        一个动态代理类可以代理多个实现接口的类。(可以得到多个房东)




AOP:面向切面编程


Spring 的关键组件之一是 AOP 框架。虽然 Spring IoC 容器不依赖 AOP(这意味着如果您不想使用 AOP,则无需使用 AOP),AOP 补充了 Spring IoC 以提供非常强大的中间件解决方案。

面向切面编程;对oop面向对象编程的补充。  

通过预编译的方式和运行期间动态代理   实现程序功能的统一维护的一种技术

函数式编程的衍生范型,

aop可使业务逻辑各个部分进行隔离,从而使得业务逻辑之间耦合度降低,提高程序可复用性,同时提高开发效率。

pom文件加依赖


方式1 
使用Spring接口   实现

准备抽象角色(行为)



真实角色(房东)


增强方法  切入方法



 
执行增强方法  在方法执行前

重写before方法  参数对应动态代理的invoke方法参数
Method   代理对象执行的方法

args   方法参数

Object    代理对象(应该说真实角色对象 )

 执行增强方法  在方法执行后

参数跟上述一样

 
 


配置xml

导入AOPjar包

将 这几个类导入 spring容器、配置aop。     需要切入点   切入方法


测试     

获取xml、文件  、(得到Spring容器)

得到代理对象(相当于一个没有类名的对象   只是实现了接口)(已经不是接口了   )(需要向上造型  变成接口对象)

执行方法


方式2  使用自定义类作为切面实现

 

将类作为切面 

设置xml文件  aop  上一种方式的bean不变
diy类为切面   可以在 切入点(方法)

切入方法。

 测试

比较简单,但是可操作性没上面的高 ,因为上面的方法参数多。
 


使用注解实现:继续使用类做切面(只是将xml文件配置换为注解) 

        和上面一样自定义类  做切面

        切点前  切点后 切点环绕

切点环绕方法执行的时机    参数jp为执行的切入点



        配置xml  将自定义类注册为Spring对象、开启注解支持

 测试和刚刚的一样

 注解的缺点:需要多次配置切点  也是一个好处。



3、整合Mybatis
       

步骤:

      1、导包:  junit 、       mybatis 、       mysql 、       spring、        aop织入、 

spring jdbc      mybatis—spring(中文文档  还有 mybatis-spring-boot-start)    (和谁整合杠谁)   

      2、编写配置文件

      3、测试
 



回忆mybatis——————

        编写实体类

        编写核心配置文件

        编写mapper接口

        编写mapper.xml

        测试

核心配置文件——

开发环境

type  哪种管理

value 驱动

url连接到哪个库、时间 、 安全连接、编码、

连接数据库 :      测试

mybatis——spring整合

        


spring中声明事务:业务一般都需要声明事务。

mybatis-spring –事务管理的官网文档

MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理。

        声明式事务:AOP 横切进去的

        编程式事务:需要在代码中声明事务的管理

      

编程式:

public class UserService {
  private final PlatformTransactionManager transactionManager;
  public UserService(PlatformTransactionManager transactionManager) {
    this.transactionManager = transactionManager;
  }
  public void createUser() {
    TransactionStatus txStatus =
        transactionManager.getTransaction(new DefaultTransactionDefinition());
    try {
      userMapper.insertUser(user);
    } catch (Exception e) {
      transactionManager.rollback(txStatus);
      throw e;
    }
    transactionManager.commit(txStatus);
  }
}

声明式事务:——————————————————————————————————— 

一、配置事务管理器的bean   DataSourceTransactionManager

二、导入TX 约束 tx:advice配置事务通知(对应下面的配置注解支持)

        transaction-manager  使用的事务管理器

        tx:attribute 配置使用事务的方法 

        tx:method 方法名  单个方法所有方法

        propagation:事务的传播级别  7种

三、AOP织入:

        aop:config 配置切入

        配置切入点   执行位置  包下的类下的所有方法(..)代表参数

        aop:advice 配置事务    pointcut-ref  配置切入点

 

配置事务管理代码

传播级别:

———————————————————————————————

注解支持

基于注解方式来进行声明式事务的操作会更加简单,在实际开发中我们也会用的比较多,我们基于以上案例继续完成

@Transactional 注解只应用到 public 修饰的方法上,在 protected、private 修饰的方法上都不会起作用

1)配置事务管理器(同上1)
<!-- 1.配置事务的管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 指定要对哪个数据库进行事务操作 -->
    <property name="dataSource" ref="dataSource"></property>
</bean>
1
2
3
4
5
2)注释掉事务的其他配置,开启事务注解
<!-- 2.开启事务的注解 -->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
1
2
完成之后的配置文件问:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

       <!--指定注解扫描包路径-->
    <context:component-scan base-package="com.oak"/>

       <!-- 导入资源文件 -->
      <context:property-placeholder location="classpath:dbutil.properties"/>
      <!-- 配置dbcp连接池参数 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
   destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url"
            value="${url}" />
        <property name="username" value="${user}" />
        <property name="password" value="${password}" />
        <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="${initsize}" />
        <!-- 连接池的最大值 -->
        <property name="maxActive" value="${maxsize}" />
        <!-- 最大空闲值。当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="${maxIdle}" />
        <!-- 最小空闲值。当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
        <property name="minIdle" value="${minIdle}" />
    </bean>
    <!-- 配置 Spring 的 jdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>    
    </bean>
    
    <!-- 1.配置事务的管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 指定要对哪个数据库进行事务操作 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    
    <!-- 2.开启事务的注解 -->
    <tx:annotation-driven transaction-manager="transactionManager">    </tx:annotation-driven>
</beans>

spring boot  直接使用@Transactional注解就行。

        

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
int和Integer有什么区别? 答:int是java的原始数据类型,Integer是java为int提供的封装类,java为每个原始数据类型都提供了封装类。 String和StringBuffer的区别? 答:String是不可变的对象,每次对String类型进行改变都相当于产生了一个新的对象,StringBuffer是可变的字符序列,所以如果要经常改变某个字符串的话建议使用StringBuffer。 list、set、map问题? 答:set 不允许重复,无序 list 允许重复,有序 map 成对的数据结构,键值必须具有唯一性 Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上低于Servlet。 面向对象的特征? 答:1:封装:通过定义类并且给类的属性和方法加上访问控制 2:继承:子类继承父类,子类可以拥有父类已定义的方法,并且子类可以修改父类的方法使其更适合特殊需求。 3:多台:不同对象对统一消息作出不同响应称之为多态 4:抽象:忽略与当前主题无关的那些方面,将注意力集在与当前目标有关的方面 运行时异常和一般异常有何异同? 答:运行时异常时(JVM)java虚拟机在运行过程发生的问题,比如:内存溢出等问题。这类异常没法要求程序员去一一捕获并抛出,一般异常是Java类库或程序员自己写的代码发生的错误,这类异常可以由我们去一一捕获并抛出。 多线程几种实现方法,同步? 答:多线程有两种实现方法,一种是继承Thread类或者实现Runnable接口。同步就是在方法返回类型后面加上synchronized。 c#的委托,事件是不是委托? 答:委托就是将方法作为一个参数带入另一个方法叫做委托,事件是一种特殊的委托。 应用程序域? 答:应用程序域可以理解为一种轻量级的进程,起到安全的作用,占用资源小。 Class.forName作用? 答:调用该访问返回一个以字符串指定类名的类对象。 JDO? 答:JDO是java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库的对象的标准化API。 CORBA? 答:CORBA标准是公共对象请求代理结构,用途为:用不同的程序设计语言书写,在不同的进程运行,为不同的操作系统开发。 xml解析技术? 答:常用的DOM、SAX等 DOM:处理大型文件时性能下降的非常厉害,适合对xml的随机访问 SAX:事件驱动型的xml解析方法,适合对xml的顺序访问 jsp常用动作? 答:jsp:include 引入一个文件 jsp:useBean 实例化JavaBean jsp:setProperty 设置JavaBean属性 jsp:getProperty 输出JavaBean属性 jsp:forward 转发 CTS、CLS、CLR分别作何解释? 答:CTS 通用类型系统、CLS 通用语言规范、CLR 公共语言运行时。 Struts1和Struts2原理和区别? 答:Struts1和Struts2是两个完全不同的框架,Struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。Struts2以核心控制器FilterDispatcher为基础,包含了框架内部的控制流程和处理机制。 Hibernate工作原理,Hibernate数据持久化? 答:Hibernate工作原理: 1:读取并解析映射信息,创建SessionFactory 2:打开Session 3:创建事物 4:持久化操作 5:提交事务 6:关闭Session 7:关闭SessionFactory Hibernate持久化:Hibernate根据定义的映射规则将对象持久化保存到数据库,这就实现了对象的持久化。 Spring由那几个模块组成? 答:Spring主要由7个模块组成: 1:Spring核心容器:提供了Spring框架的基本功能 2:Spring AOP:通过配置管理特性 3:Spring ORM:Spring框架集成了若干ORM框架 4:Spring DAO:打开关闭数据库连接 5:Spring WEB:为基于WEB服务的应用程序提供上下文服务 6:Spring Context:向Spring框架提供上下文信息 7:Spring MVC:分离模型、视图、控制器、以便更容易定制 折构函数和虚函数? 答:折构函数式销毁一个类的函数,虚函数是为了C++的动态绑定而设计的。 描述你的编程风格? 答:类名首字母大写,常量一般全部大写,给自己的代码加注释。 控制流程? 答:控制流程一般使用if判断条件。有第二分支,多分支,循环结构。循环本质上也是通过判断来实现的。 多形与继承? 答:多形:一个类多个同名方法。继承:子类继承父类。 jsp内置对象? 答:request 用户端请求 response 回应 pageContext 网页属性 session 会话 out 输出 page 当前网页 exception 错误网页 application servlet正在执行的内容 config servlet构架部件 Struts模型驱动? 答:封装请求参数。 简述JDBC? 答:JDBC数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问。 什么情况下不建议使用Hibernate? 答:当数据量大,并且表关系复杂的时候不建议使用。 sleep()和wait()有什么区别? 答:sleep()是线程类的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但监控状态依然保持,到时候会自动恢复。 wait()是Object类的方法,对此对象调用了wait方法导致本线程放弃对象锁,进入等待锁定池,只有针对此对象发出notify方法后本线程才进入对象锁定池准备获得对象锁进入运行状态。 同步和异步,在什么情况下分别使用? 答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步。在很多情况下采用异步往往更有效率。 数据库三大范式? 答:1:确保每列都是不可分割的原子值 2:确保每列都和主键相关 3:确保每列都和主键直接相关,而不是间接相关 单例模式有哪些好处? 答:单例模式是一种比较常见的设计模式,带给我们以下好处: 1:控制资源的使用 2:控制实例的产生数量 3:让多个不相关的两个线程或进程之间实现通信 为什么要用spring? 答:1、主要将各个框架有效的联系起来,缩短实际编程时间。 2、可以将各个框架进行有效的管理和控制,让数据传输安全。 springIOC和DI? 答:控制反转和依赖注入是spring的两大基础作用。主要是将所有组件在spring提供的外部容器加载。提高安全性,减低耦合性,使各个框架或者类之间的依赖性降低。 什么是声明式的事务管理?为什么要用?spring如何实现声明式的事务管理? 答:声明式的事务管理主要是将在进行对数据库数据的添加或者修改时需要执行事务管理,主要是为了避免在执行添加或修改的时候添加或修改不完全正确,导致数据丢失。spring使用AOP面向切面的思想进行事务管理的。 spring和Hibernate继承后,定义事务管理特性的时候查询为什么要定义为read-only? 答:因为添加、删除和更新都涉及到了数据库的修改,而查询并未涉及到数据库修改,所以只需要定义只读,这样可以提高效率,进行更加方便的事务管理。 请你谈谈对Hibernate OR映射的理解? 答:将数据库的每一张表都映射成一个实体。 配置了lazy="true"一定会懒加载吗? 答:不一定,如果在配置你也使用了fetch属性的话此时lazy就会失效。 Hibernate数据库标识与主键之间的认识? 答:标识是为了方便和简介映射文件,主键是为了让数据不会重复。 为什么每次请求都要创建一个Action对象? 答:Struts2每次请求的时候都会创建一个action实例,这样会保证线程的安全。Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存去读取,它是单例模式,安全性较差。 Struts2是如何实现MVC模式的? 答:在Struts2里面是将每次页面的请求进行处理,然后将请求需要输出的数据转发到需要做数据显示的页面。Struts2只是起到一个数据接收和转接的功能,就是Controller控制器,而传来数据的页面叫view显示层,Struts2将数据提交给进行处理的类叫Model模型层,专门进行数据处理和数据库的连接。 heap和stack有什么区别? 答:栈是一种线形集合,其添加和删除元素的操作应在同一段完成,栈按照后进先出的方式进行处理。堆是栈的一个组成元素。 EJB和JavaBean的区别? 答:EJB不是一般的JavaBean,EJB是企业级的JavaBean,EJB一共分为3种,实体Bean,消息Bean,会话Bean。书写EJB要遵循一定的规范,另外要运行EJB,你需要有相应的EJB容器,比如WebLogic、jboss等,而JavaBean不需要,只需要安装Tomcat就可以了。EJB用于服务端的应用开发,而JavaBean用于客户端应用开发。 触发器? 答:触发器是一种特殊的存储过程,主要通过事件来触发而被执行。 什么是存储过程?用什么调用? 答:存储过程是一个预编译的SQL语句,优点是允许模块化的设计。就是说只需要创建一次,以后再程序就可以调用多次。使用存储过程比单纯的SQL语句要快,可以用一个命令对象来调用存储过程。 索引优缺点? 答:索引可以提高对数据库数据的检索,缺点是减慢了数据录入速度,同时也增加了数据库的尺寸大小。 什么是事务?什么是事锁? 答:事务就是被绑定在一起,作为一个逻辑单元执行的SQL语句。如果任何一个操作失败,那么整个就失败。共同失败或共同成功。锁可以保证事务的完整性和并发性。 什么是视图?游标是什么? 答:视图是一种虚拟的表,具有和物理表相同的功能。游标是对查询出来的结果集作为一个单元来有效的处理,可以对结果集的当前行做修改。 select执行顺序? 答:from where group by having select order by Collection和Collections的区别? 答:Collection是集合类的父类,继承它的主要由set和list Collections是针对集合类的帮助类,它提供了一系列针对集合的搜索,排序,线程安全化等操作。 final、finally、finalize的区别? 答:final用于声明属性方法和类,分别表示:属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句的一部分,表示总是执行。 finalize是Object的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。 assert是什么?什么时候用到? 答:断言,可以将断言看成是异常处理的一种高级形式,可以用来判断某个特定的表达式或值是否为真。 接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类? 答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类。 引用传递和值传递? 答:引用传递:形参改变影响实参 值传递:形参改变不影响实参 当一个线程进入一个对象的synchronized方法后,其他线程是否可进入此对象的其他方法? 答:其他方法前是否加了synchronized关键字,如果没加则能。 说出servlet生命周期? 答:servlet实例化时调用init方法,得到请求时调用service方法,service方法自动派遣doget或dopost方法,最后当实例销毁时调用destroy方法。 error和exception有什么区别? 答:error是指错误,通常程序员不能通过代码来解决。底层环境或硬件问题。 exception是指异常,可以通过代码来解决的问题。 forward和redirect的区别? 答:forward是转发,浏览器跳转后不显示新的地址。 redirect是重定向,浏览器跳转后显示新的地址。 对比之下forward更加高效,并且它有助于隐藏实际地址,但是有些情况则必须使用redirect,否则会报异常。 jsp动态include和静态include的区别? 答:动态include用jsp:include实现,适用于动态页面,可以携带参数 静态include用include伪码实现,适用于静态页面 math.round(11.5)等于多少?math.round(-11.5)等于多少? 答:Math.round()对数字进行四舍五入 Math.round(11.5)=12 Math.round(-11.5)=11 String s=new String("xyz");创建了几个String Object? 答:创建了两个String对象,一个保存的引用地址,一个保存实际的值。 数组有没有length()这个方法?String呢? 答:数组里面没有length()方法,而是length属性。String有length()这个方法。 swtich()能否作用在byte、long、String上? 答:swtich()传递的应该是一个整数表达式,所以它的值只能是:int、short、char、byte所以long和String都不能作用在swtich()上。 jsp和servlet之间的联系? 答:jsp前段动态页面,servlet是纯java类 jsp被编译之后会转换为servlet执行 java基本数据类型有哪些?String是不是基本数据类型,他们有何区别? 答:基本数据类型8种:int、short、byte、long、float、double、char、boolean String不是基本数据类型,引用数据类型。 区别:基本数据类型比较实用“==”,引用数据类型实用equest,并且引用数据类型存放的是地址而不是具体的值。 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出bbbhhtccc? 答:String s="bbbwlirbbb"; s.replaceAll("wlirbbb","hhtccc"); 如何将数值型字符转换为数字(Integer,Double)? 答:可以用Integer.parseInt()和Double.parseDouble()方法 如何将数字转换为字符? 答:可以使用String的valueOf()方法。 如何取得1970到现在的毫秒数? 答:可以用getTime()方法。 如何格式化日期? 答:可以用SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd"); 判断是否有子文件?判断是否有子目录?判断文件是否存在? 答:判断是否有子文件使用file.isFile() 判断是否有子目录使用file.isDirectory() 判断文件是否存在使用file.exists() 继承、重载、覆盖问题? 答:继承:子类继承父类,子类可以拥有父类已定义的方法,并且子类可以修改父类的方法使其更适合特殊需求。 重载:在一个类方法名和返回类型相同,参数不同。 覆盖:在子类覆盖父类的某个方法,要求方法名相同,参数类型相同。 Statement和PreparedStatement之间的区别? 答:Statement比PreparedStatement速度慢 PreparedStatement是预编译,插入时速度高于Statement Statement创建速度很慢,常用选择PreparedStatement Session机制? 答:session机制是一种服务器端机制,服务器使用一种类似于散列表的结构来保存信息。 jsp和servlet的请求转发分别如何实现? 答:jsp可以使用jsp:forward标签转发 servlet可以使用request.getRequestDispatcher()实现转发 介绍j2ee、j2se、j2me的区别? 答:j2ee(企业版):主要用于企业web开发 j2se(标准版):主要用于web开发,但缺少企业版的一些特性 j2me(微小版):主要用于手机开发 J2ee提供的技术? 答:j2ee提供的技术有EJB、servlet、jsp等。 什么是Application Server? 答:Application Server 应用服务器 简单介绍连接池的优点和原理? 答:数据库连接和关闭是比较花费时间的一件事,而连接池可以提高我们的工作效率。 刚开始创建一定数量的池连接,当需要时从池连接拿出一个,用完之后再把这个连接重新放回连接池。 Web.xml的作用? 答:Web.xml会在程序启动时执行,如果想在程序刚启动的时候执行一些方法的话可以配置在Web.xml。 简单介绍您所了解MVC? 答:在项目使用MVC模式会使项目分工更加明确,结构更加清晰 M model 模型层:JavaBean V view 视图层:jsp html C controller 控制层:servlet 简单介绍你所了解XML? 答:XML可扩展标记语言,可以用来标记数据,定义数据结构,是一种允许用户自定义标记的语言 简单介绍您所了解的structs、spring和hibernate? 答:struts:控制层Action,页面标签和Model数据,调用业务层 Spring:Aop管理事务控制,IOC管理各个组件的耦合 Hibernate:负责数据库和对象的映射,负责Dao层 因为你去公司面试,公司让你写笔试,不可能说XX一个题目写两页纸写的太详细,所以以上答案有的可能比较简短,没有说出重点,请大家补充,如果大家有什么更好的答案请拿出来一起分享

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值