一、spring创建对象的特点:
一、spring创建对象的特点:
scope=“singleton” 是单例模式,读取配置文件就创建,只创建一次
lazy-init="true"只对 scope="singleton"有用,目的是读取配置文件不创建对象。
scope=“prototype” 每次创建都是新的,读取配置文件不创建对象,getBean(“”)时候创建。
boy.name=“tom”;
boy2.name=“mike”;
System.out.println(boy==boy2);//true 一个
System.out.println(boy.name+"\t"+boy2.name);
true
mike mike
当这个对象有自己的属性,不能用单例。如果没有属性或者属性可以是大家共用的,这个时候可以用单例。
spring管理controller,service,dao,都是单例。
二、实例化bean的三种方式
1、默认构造方法
2、静态工厂
(1)public class BoyFactory {
public static Boy getBoys(){
return new Boy();
}
}
(2)spring.xml
class=“工厂的包名、类名”
(3)调用
Boy b=(Boy)bean.getBean(“boy2”);
b.show();
3、实例工厂
(1)public class BoyFactory2 {
public Boy getBoys(){
return new Boy();
}
}
(2)spring.xml
<bean id="boyFactory2" class="com.factory.BoyFactory2"></bean>
<bean id="boy3" factory-bean="boyFactory2" factory-method="getBoys"></bean>
(3)测试
Boy b=(Boy)bean.getBean(“boy3”);
b.show();
三、属性的注入
A、基本属性注入
(1)public class Boy {
String name;
int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
(2)spring.xml
B、对象类型属性注入
(1)public class Girl {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
(2)
public class Boy {
Girl girl;
public void show(){
System.out.println(“show=”+name+"\t"+age+"\t"+girl.getName());
}
}
(3)、
**** ****练习:
有一个Person类,里面name,age,Cat属性
还有一个Cat类,里面有name,type
通过spring注入,有一个人名字是mike,属性一只猫,猫的名字是huahua
集合注入
private Listtels;
2、spring.xml
123 456 789作业:
有一个UsersMysqlDao类,里面有一个无参数,无返回值的save方法,输出mysql save
有一个UsersOraDao类,里面有一个无参数,无返回值的save方法,输出oracle save
有一个UsersService类,有一个dao属性,根据用户的不同需要,分别实现mysql和oracle的save方法,体验切换不同的保存方法
四、注解方式
<context:component-scan base-package="com.dao.impl,com.service"></context:component-scan>
1、一共4种
@Component 指定把一个对象加入IOC容器,不属于下面的三个层
@Repository 作用同@Component; 在持久层使用,数据层
@Service 作用同@Component; 在业务逻辑层使用
前三个可以互换,本身就是创建
@Controller 在控制层使用
@Autowired 自动注入,按照类型
@Autowired
@Qualifier(value=“usersOraDao”)//按照id去注入
IUserDao dao;
//@Autowired 默认是按照接口类型匹配
//@Qualifier(value=“usersOraDao”) 一个接口多个实现类,指定实现类的名字。
@Resource(name=“usersOraDao”)//默认就是id名字匹配。
静态代理模式:
1、接口,定义要代理方法。
2、有一个代理类,实现接口,里面接口类型属性
3、有一个被代理类,实现接口
4、测试
AOP
业务代码与关注点代码分离,好处?
--à 关注点代码写一次即可;
-à开发者只需要关注核心业务;
-à运行时期,执行核心业务代码时候动态植入关注点代码; 【代理】
(1)注解方式:
spring.xml
<context:component-scan base-package="com.dao,com.app"></context:component-scan>
<!-- 支持aop注解方式 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
(2)切面类
@Aspect//切面
@Component//创建
public class App {
@Pointcut("execution(* com.dao.*.*(..))")// com.dao所有方法 * 所有返回值,.*.*所有类,所有方法,(..)参数任意
public void method(){
}
@Before("method()")//前置通知
public void before(){
System.out.println("开启事务,前置通知");
}
@After("method()")//后置通知,执行方法之后
public void after(){
System.out.println("关闭事务,最终通知");
}
@AfterReturning("method()")
public void back(){
System.out.println("返回后");
}
@AfterThrowing("method()")
public void yichang(){
System.out.println("异常通知");
}
@Around("method()")
public void around(ProceedingJoinPoint p) throws Throwable{
System.out.println("环绕前------");
p.proceed();//方法是分割线
System.out.println("环绕后----------");
}
}
被拦截类
@Repository
public class UsersDao {
public void save(){
System.out.println("save");
}
public void update(){
//
System.out.println("update");
System.out.println(10/0);
//System.out.println("关闭事务");
}
}
servlet2种跳转方式:
请求转发:
1、地址栏的地址和请求地址一致
2、request范围内的值在
重定向:
1、地址栏的地址和请求地址不一致
2、request范围内的值不存在
3、可以定向到项目外的地址
页面路径:
/user/login.action 认为是绝对路径,http://localhost:8080+ /user/login.action
user/login.action 相对路径,http://localhost:8080/web06303/ + user/login.action
Controller是请求转发跳转,省掉/项目名.
1、springMVc的流程:
页面提交请求.action,web.xml —DispatcherServlet 同时加载spring.xml, 通过映射器和适配器,找到action的方法, model
页面带值,视图解析器跳转页面。
2、springMVC的项目步骤:
(1)、jar
(2)、web.xml加入
DispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring.xml 1 DispatcherServlet *.action CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8(3)、spring.xml
<context:component-scan base-package="com.controller"></context:component-scan>
<!-- 视图解析器,会在返回的字符串前后加上前缀和后缀 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="suffix" value=".jsp" />
</bean>
(4)Controller
@Controller
@RequestMapping(“user”)
public class ComputerAction {
@RequestMapping(“computer.action”)
public String com(int num1,int num2,String flag,Model model){
作业:
重新搭建springMVC项目,然后做addDept.jsp
仿照数据库dept表3个字段,然后请求action获取页面的值,页面进行为空校验。
做一个页面,页面有
单选按钮权限 管理员 普通员工。
复选框 技能 Java c html ,
下拉框 城市 北京、上海、大连
文本域 介绍 ,
每一个组件都有默认值
.
作业:用jq的ajax请求完成:
1登录,用户名和密码是tom,123,显示登录成功sec,否则显示登录失败fail
2、一个文本框输入用户名,如果是tom,在页面上显示不可用或者显示不可用的图片,
如果不是tom,显示可用或者可用的图片
返回对象的json
1、jar
2、spring.xml 配置json适配器
3、@ResponseBody