### Bean的作用域:单例(singleton),多例(prototype)
1.单例模式:表示在任何地方使用对象,总是一个(对象是唯一的)。
(笔面试重点)
饿汉式 public class King{ private final static King king = new King(); private King(){ } public static King getKing(){ return king; } } 懒汉式 public class King{ private static King king ; private King(){ } public static King getKing(){ if(king==null){ king = new King(); return king; }else{ return king; } } } public class King{ } <bean id="king" class="xx.xx.King"/> King king1 = ac.getBean("king",King.class); King king2 = ac.getBean("king",King.class); System.out.println(king1==king2)
--------------------------------------------------------------------------------
开发步骤
1.创建maven工程
1)添加web.xml
2) 添加Tomcat运行环境
3)在pom.xml添加依赖jar包 spring-webmvc junit
4)添加配置文件
2.编写King类
public class King {
}
3.在配置文件中配置Bean
<!-- 默认spring实例化的对象是单例的 1.scope表示设置对象的作用域 2.如果把对象设置为多例,那么scope="prototype" 3.singleton表示单例的属性值 --> <bean id="king" class="cn.sjl.spring.bean.King" scope="singleton"/>
###Bean的延迟加载
1.立即加载:在spring容器读取配置文件时候,对象就被创建,这个时候创建的对象就是立即加载。
2.延迟加载: 不是读取配置文件时创建对象,而是使用对象时创建对象。 好处:可以节省内存
3.配置延迟加载
<!-- 默认创建对象的时机是立即加载 1.lazy-init表示设置是否延迟加载 2.lazy-init="true"表示延迟加载 --> <bean id="king1" class="cn.sjl.spring.bean.King" scope="singleton" lazy-init="true"/>
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
### IOC(重要):控制反转(Inversion Of Control),原来创建对象和管理对象由程序代码完成,使用spring之后,创建对象和管理对象的权利交给Spring容器(交给配置文件),控制权的转移叫控制反转。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
###给成员变量赋值(依赖注入DI)
spring中赋值的两种方式:1.set方法 2.构造方法
思路:页面-控制器-业务层-持久层
1.使用set方法赋值(推荐使用)
1.在cn.sjl.dao包新建接口UserDao public interface UserDao{ void insertUser(); void updateUser(); void deleteUser(); void seletById(); void seleteAll(); } 2.新建接口的实现类:把接口中的方法实现,在方法中做控制台输出 public class UserDaoImpl implements UserDao{ public void insertUser(){ System.out.println("添加成功"); } ...... } 3.在cn.sjl.service包中定义业务层的接口UserService public interface UserService{ void addUser(); } 4.新建接口的实现类UserServiceImpl public class UserServiceImpl implements UserService{ private UserDao userDao; public void setUserDao(UserDao userDao){ this.userDao = userDao; } public void addUser(){ userDao.insertUser(); } }
5.配置文件
<bean id="userDao" class="cn.sjl.dao.UserDaoImpl"/> <bean id="userService" class="cn.sjl.service.UserServiceImpl"> //1.property表示给成员变量(属性)赋值 //2.调用set方法 //3.name表示属性名 //4.ref表示bean的id名 <property name="userDao" ref="userDao"/> </bean>
测试:
getBean("userService",XXX); cn.sjl.servlet public class UserServlet{ pivate UserServie userService; //setXX... public void doGet(){ userService.addUser(); } }
实例化UserServlet,使用set方法给userService依赖注入
测试:获取UserServlet对象,调用doGet方法.
2.构造方法赋值
1.定义带参的构造方法
public UserServletImpl(){
} public UserServletImpl(UserDao userDao){ this.userDao = userDao; } <bean id="userService2" class="cn.sjl.service.UserServiceImpl"> //constructor-arg表示构造方法赋值 //index表示构造方法参数的索引,从0开始 //ref表示已经实例化的对象的id属性值 <constructor-arg index="0" ref="userDao"/> </bean>
3.自动装配(了解)
byName byType
//1.autowire表示使用自动装配的方式给成员变量赋值
//2.byName表示匹配UserServiceImpl属性名赋值
<bean id=“userService3” class=“xxx.xx.UserServiceImpl” autowire=“byName”/>
//1.byType表示根据属性的类型匹配UserDao userDao;
//2.如果匹配的相同类型的对象有多个,会出现异常。
<bean id=“userService4” class=“xxx.xx.UserServiceImpl” autowire=“byType”>
再看看书(新书和旧书),这个Spring笔记2,配置文件id是接口名,一个好像是实现类的名字,还是说id这个是随意的,是多态的上溯造型?还是随意的?自动装配的相关注解看看;
--------------------------------------------------------------------------------------------------------------------------------------------