Spring快速入门&Bean实例化和依赖注入&相关API

Spring程序开发步骤
①导入 Spring 开发的基本包坐标
②编写 Dao 接口和实现类
③创建 Spring 核心配置文件
④在 Spring 配置文件中配置 UserDaoImpl
⑤使用 Spring 的 API 获得 Bean 实例

演示:
①导入 Spring 开发的基本包坐标

<properties>
	<spring.version>5.0.5.RELEASE</spring.version>
</properties>
<!--导入spring的context坐标,context依赖core、beans、expression-->
<dependencies> 
    <dependency>  
        <groupId>org.springframework</groupId> 
        <artifactId>spring-context</artifactId> 
        <version>${spring.version}</version>
    </dependency>
</dependencies>

②编写 Dao 接口和实现类

public interface UserDao {  
    public void save();
}
public class UserDaoImpl implements UserDao {  
        @Override  
        public void save() {
        	System.out.println("UserDao save method running....");
	}
}

③创建 Spring 核心配置文件
*在类路径下(resources)创建

applicationContext.xml配置文件
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

④在 Spring 配置文件中配置 UserDaoImpl
*在applicationContext.xml文件中

<?xml version="1.0" encoding="UTF-8" ?>
...
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
</beans>

⑤使用 Spring 的 API 获得 Bean 实例

@Test
public void test1(){
ApplicationContext applicationContext = 
new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.save();
 }

Bean实例化三种方式
1) 使用无参构造方法实例化
*它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>

2) 工厂静态方法实例化

  • 工厂的静态方法返回Bean实例

    public class StaticFactoryBean {
    public static UserDao createUserDao(){
    return new UserDaoImpl();
    }
    }

3) 工厂实例方法实例化
*工厂的非静态方法返回Bean实例

public class DynamicFactoryBean {  
	public UserDao createUserDao(){        
		return new UserDaoImpl(); 
	}
}


<bean id="factoryBean" class="com.itheima.factory.DynamicFactoryBean"/>
<bean id="userDao" factory-bean="factoryBean" 
factory-method="createUserDao"/>

Bean的依赖注入方式
①构造方法
*创建有参构造

public class UserServiceImpl implements UserService {
@Override
public void save() {
ApplicationContext applicationContext = new 
     ClassPathXmlApplicationContext("applicationContext.xml");
     UserDao userDao = (UserDao) applicationContext.getBean("userDao");    
          userDao.save();
    }
 }

*配置Spring容器调用有参构造时进行注入

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>

②set方法
*在UserServiceImpl中添加setUserDao方法

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;  
        } 
    @Override    
    public void save() {      
   		 userDao.save();
	}
}

*配置Spring容器调用set方法进行注入

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
	<property name="userDao" ref="userDao"/>
</bean>

set方法:P命名空间注入(很少用,详见老师笔记)

Bean的依赖注入的数据类型
(1)普通数据类型的注入

public class UserDaoImpl implements UserDao {
private String company;
   private int age;
   public void setCompany(String company) {
       this.company = company;
  }
   public void setAge(int age) {
       this.age = age;
  }
   public void save() {
       System.out.println(company+"==="+age);
       System.out.println("UserDao save method running....");  
  }
}

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
   <property name="company" value="传智播客"></property>
   <property name="age" value="15"></property>
</bean>

(2)集合数据类型(List)的注入

public class UserDaoImpl implements UserDao {
private List<String> strList;
public void setStrList(List<String> strList) {
this.strList = strList;
}
public void save() {
       System.out.println(strList);
       System.out.println("UserDao save method running....");
	 }
}

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
   <property name="strList">
       <list>
           <value>aaa</value>
           <value>bbb</value>
           <value>ccc</value>
       </list>
   </property>
</bean>

(3)集合数据类型(List)的注入

public class UserDaoImpl implements UserDao {
private List<User> userList;
public void setUserList(List<User> userList) {
this.userList = userList;  
}
public void save() {
System.out.println(userList);
System.out.println("UserDao save method running....");
 }
}

<bean id="u1" class="com.itheima.domain.User"/>
<bean id="u2" class="com.itheima.domain.User"/>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
   <property name="userList">
       <list>
           <bean class="com.itheima.domain.User"/>
           <bean class="com.itheima.domain.User"/>
           <ref bean="u1"/>
           <ref bean="u2"/>      
       </list>
   </property>
</bean>

(4)集合数据类型( Map<String,User> )的注入

public class UserDaoImpl implements UserDao {
   private Map<String,User> userMap;
   public void setUserMap(Map<String, User> userMap) {
   this.userMap = userMap;
  }    
public void save() {      
System.out.println(userMap);
System.out.println("UserDao save method running....");
}
}

<bean id="u1" class="com.itheima.domain.User"/>
<bean id="u2" class="com.itheima.domain.User"/>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
   <property name="userMap">
       <map>            
           <entry key="user1" value-ref="u1"/>
           <entry key="user2" value-ref="u2"/>
       </map>
   </property>
</bean>

(5)集合数据类型(Properties)的注入

public class UserDaoImpl implements UserDao {
   private Properties properties;
   public void setProperties(Properties properties) {
       this.properties = properties;
  }
public void save() {
System.out.println(properties);
System.out.println("UserDao save method running....");
}
}

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
   <property name="properties">
       <props>
           <prop key="p1">aaa</prop>
           <prop key="p2">bbb</prop>
           <prop key="p3">ccc</prop>
       </props>
   </property>
</bean>

spring相关API
1.ApplicationContext的继承体系
applicationContext:接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象
2.ApplicationContext的实现类
2.1 ClassPathXmlApplicationContext
它是从类的根路径下加载配置文件 推荐使用这种
2.2 FileSystemXmlApplicationContext
它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。
2.3 AnnotationConfigApplicationContext
当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。
3. getBean()方法使用

public Object getBean(String name) throws BeansException {  
assertBeanFactoryActive();  
return getBeanFactory().getBean(name);
}

public <T> T getBean(Class<T> requiredType) throws BeansException {
assertBeanFactoryActive();
return getBeanFactory().getBean(requiredType);
}

其中,当参数的数据类型是字符串时,表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。
当参数的数据类型是Class类型时,表示根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错
getBean()方法使用

ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService1 = 
(UserService) applicationContext.getBean("userService");
UserService userService2 = 
applicationContext.getBean(UserService.class);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值