spring容器又叫ioc容器,用来创建和管理bean(对象)的一个容器。ioc是一种思想,而DI是它的实现方式。
创建容器的两种方式:
1通过类加载.ClassPathXmlApplicationContext.xml
2通过类加载.FileSystemXmlApplicationContext.xml
通过注解的方式AnnotationConfigApplicationContext.xml
ApplicationContext.xml
<!-- 1 Ioc(控制反转),又叫Ioc容器,用来管理bean-->
<!-- Bean实例化的四种方式-->
<!-- 1无参构造方法实例化———(常用)—-->
<!--
解释: init-method和destroy-method,管控bean的生命周期,当scope是值是prototype时,spring则不会监控bean的生命周期
-->
<!-- <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="singleton" init-method="init" destroy-method="destroy"></bean>-->
<!-- 2工厂静态方法实例化—————直接用类调用方法 (了解)-->
<!-- <bean id="userDao" class="com.itheima.factory.StaticFactory" factory-method="getUserDao"></bean>-->
<!-- 3工厂实例方法实例化————要先创建一个工厂的bean,再用对象调用方法(了解)-->
<!--<bean id="factory" class="com.itheima.factory.DynamicFactory" ></bean>-->
<!--<bean id="userDao" factory-bean="factory" factory-method="getUserDao" ></bean>-->
<!-- 4 (实用)通过实现FactoryBean接口创建bean,是解决了factory-method的方法需要自定义问题,每次都要修改factory-method中的方法
而spring对其进行了改造,统一用getObject方法代替factory-method中的方法,实现factoryBean接口时重写getObject方法即可-->
<!-- 2 依赖注入:描述了在容器中创建bean与bean之间依赖关系的过程
注入基本数据类型用value: <property name="database" value="shop"></property>
注入引用数据类型用ref: <property name="userDao" ref="userDao"></property>
-->
<!--1通过子元素property,用setter方法注入—————需要用到时才会注入-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<!--通过p空间注入-->
<!-- <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>-->
<!-- <bean id="userService" class="com.itheima.service.impl.UserServiceImpl" p:userDao-ref="userDao">-->
<!-- </bean>-->
<!--通过带参构造注入————一定会注入-->
<!-- <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>-->
<!-- <bean id="userService" class="com.itheima.service.impl.UserServiceImpl" >-->
<!-- 1 下面的name值是形参中的名字-->
<!-- <constructor-arg name="userDao" ref="userDao"></constructor-arg>-->
<!-- 2 下面的index值是形参中的位置,解决参数类型重复问题-->
<!-- <constructor-arg index="1" ref="userDao"></constructor-arg>-->
<!-- <constructor-arg index="0" ref="userDao2"></constructor-arg>-->
<!-- </bean>-->
dao层
public class UserDaoImpl implements UserDao {
public UserDaoImpl(){
System.out.println("spring实例化bean都是调用的无参构造方法 ");
}
//bean的生命周期:从init到destroy
// 在bean中中设置了init-method属性,bean初始化时会调用这个方法
public void init(){
System.out.println("bean初始化时对应的操作。。。");
}
// 在bean中中设置了destroy-method属性,代表bean的销毁
public void destroy(){
System.out.println("销毁方法。。。。");
}
public void save() {
System.out.println("save running...");
}
}
service层
public class UserServiceImpl implements UserService {
//方式2 通过setter方法注入获取userDao对象
private UserDao userDao ;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public UserServiceImpl(UserDao userDao){
this.userDao = userDao;
}
public UserServiceImpl(){
System.out.println("因为spring在实例化bean对象的时候,都是调用无参构造方法,所以需要显示给出无参构造");
}
public void save() {
//方式1 从容器获取userDao对象
// ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
// UserDao userDao = (UserDao) app.getBean("userDao");
userDao.save();
}
}
public class SpringTest {
@Test
public void test1(){
//方式一 常用的方式,在类路径下加载
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) app.getBean("userDao");
//放式二 通过绝对路径
ApplicationContext app = new FileSystemXmlApplicationContext("applicationContext.xml");
//方式三 通过注解的方式,不需要xml文件
ApplicationContext app = new AnnotationConfigApplicationContext("SpringConfig.class");