一、spring的注解方式
@Controller
- 标识一个该类是Spring MVC controller处理器,用来创建处理http请求的对象.
@RestController
- Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。
@Service
- 用于标注业务层组件,说白了就是加入你有一个用注解的方式把这个类注入到spring配置中
@Autowired
- 用来装配bean,都可以写在字段上,或者方法上。
- 默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false)
@RequestMapping
-
类定义处: 提供初步的请求映射信息,相对于 WEB 应用的根目录。
-
方法处: 提供进一步的细分映射信息,相对于类定义处的 URL。
@RequestParam
- 用于将请求参数区数据映射到功能处理方法的参数上
@ModelAttribute
使用地方有三种:
1、标记在方法上。
- 标记在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中。
- A.在有返回的方法上:
- 当ModelAttribute设置了value,方法返回的值会以这个value为key,以参数接受到的值作为value,存入到Model中,如下面的方法执行之后,最终相当于 model.addAttribute(“user_name”, name);假如 @ModelAttribute没有自定义value,则相当于model.addAttribute(“name”, name);
- B.在没返回的方法上:
- 需要手动model.add方法
2、标记在方法的参数上。
- 标记在方法的参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用.我们在上面的类中加入一个方法如下
@Cacheable
- 用来标记缓存查询。可用用于方法或者类中
@CacheEvict
- 用来标记要清空缓存的方法,当这个方法被调用后,即会清空缓存。@CacheEvict(value=”UserCache”)
@Resource
-
@Resource的作用相当于@Autowired只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。
-
@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
-
@Resource装配顺序:
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
- 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
- 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
@PostConstruct
-
用来标记是在项目启动的时候执行这个方法。用来修饰一个非静态的void()方法也就是spring容器启动时就执行,多用于一些全局配置、数据字典之类的加载
-
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执
@PreDestroy
- 被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前
@Repository
- 用于标注数据访问组件,即DAO组件
@Component
- 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
@Scope
- 用来配置 spring bean 的作用域,它标识 bean 的作用域。
- 默认值是单例
singleton:单例模式,全局有且仅有一个实例
prototype:原型模式,每次获取Bean的时候会有一个新的实例
request:request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
session:session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
global session:只在portal应用中有用,给每一个 global http session 新建一个Bean实例。
@SessionAttributes
-
默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中
-
参数:
- names:这是一个字符串数组。里面应写需要存储到session中数据的名称。
- types:根据指定参数的类型,将模型中对应类型的参数存储到session中
- value:和names是一样的。
@Required
-
适用于bean属性setter方法,并表示受影响的bean属性必须在XML配置文件在配置时进行填充。否则,容器会抛出一个BeanInitializationException异常。
@Qualifier
- 当你创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean 将会被装配来消除混乱。
二、简述get和post请求的区别
1、传送方式:get通过地址栏传输,post通过报文传输。
2、传送长度:get参数有长度限制(受限于url长度),而post无限制
3、GET和POST还有一个重大区别,简单的说:GET产生一个TCP数据包;POST产生两个TCP数据包
- 总的说:
- 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
- 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
三、HashMap的几种遍历方式
1、使用For-Each迭代map.entrySet()方法
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue())
}
2、使用For-Each迭代keys和values
可单独取key或value
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
3、使用Iterator迭代
Map map = new HashMap();
Iterator ite= map.entrySet().iterator();
while (ite.hasNext()) {
Map.Entry entry = (Map.Entry) ite.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key = " + key + ", Value = " + value);
}
4、迭代keys并搜索values,比较低效
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key = " + key + ", Value = " + value);
}
此方法看上去比方法1更为简洁,map.get(key)
却更为耗时,所以性能低下。
四、java多态
Java多态概述
- 多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java 对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用(invokevitual)和接口引用调用(invokeinterface)的实现则有所不同。
多态的要点:
-
1.多态是方法的多态,不是属性的多态(多态与属性无关)
-
2.多态存在要有3个必要条件:继承、方法重写、父类引用指向子类对象。
-
3.父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了
重载和重写的区别:
- 重载就是在同一个类当中有多个名称相同方法,但各个相同方法的参数列表不同(无关返回值类型)。如下,在test3中三个方法名相同的add方法,第一个是两个int类型的书相加,第二个是三个int相加,第三个是两个float相加,他们的参数个数不同或类型不同就构成了重载。
- 重写则发生在不同的类当中,并且两者要有继承关系,重写是方法名字和参数的列表是要完全一致的,重写的意义在于父类的方法已经不能满足时,子类重写为自己需要的。如下,在父类Test3中num方法是想做两数的加法运算,而在子类Test4中我想做两数的减法运算,则继承的num方法不能满足,则重写为test4中的num方法进行减法运算。
五、ArrayList删除指定元素
ArrayList有两种方法可以移除元素,一种是传递要移除的元素的索引,另一种是传递要移除的元素本身(如果存在)
按索引删除
- 使用remove将索引作为参数传递,我们可以删除列表中指定位置的元素,并将任何后续元素向左移动,从其索引中减去一个元素。执行后,remove方法将返回已删除的元素:
List<String> array = new ArrayList();
array.remove(1);
按元素删除
- 另一种方法是使用此方法从列表中删除元素的第一个匹配项。形式上讲,如果存在的话,我们删除具有最低索引的元素,如果不是,列表不变。
array.remove("wendada");
迭代删除
- 有时我们希望在循环时从ArrayList中移除元素。由于没有生成ConcurrentModificationException,我们需要使用迭代器类来正确地执行它让我们看看如何在循环中除去元素:
Iterator <String> iterator = array.iterator();
while(iterator.hasNext()) {
if(iterator.netx.equals("wendada")){
iterator.remove();
}
}
阵列列表ArrayList#删除(JDK 8+)
- 如果我们使用JDK 8或更高版本,我们可以利用ArrayList#removeIf来删除满足给定谓词的ArrayList的所有元素。
array.remove(p -> p.equals("wendada"));
assertEquals(2,array.size());
assertFalse(array.contains("wendada"));