Bean的实例化与装配(实验二)

< bean >元素的常用属性及其子元素

id是一个Bean的唯一标识符,Spring容器对Bean的配置、管理都通过该属性来完成。
nameSpring亦可通过该属性对容器中的Bean进行配置和管理,name可为Bean指定多个名称,每个名称用逗号或分号隔开。
class该属性指定了Bean的具体实现类。它必须是一个完整的类名,使用类的全限定名。
scope用来设定Bean实例的作用域,常用的有:singleton(单例),prototype(原型)。其默认值为singleton(单例)。
property元素的子元素,用于调用Bean实例中的setter方法完成属性赋值,完成依赖注入,该元素的name属性指定Bean实例中的相应属性名,ref属性或value属性用于指定参数值。
ref可用于指定Bean工厂中某个Bean实例的引用。
value可用于直接指定一个常量值。
list用于封装List或数组类型的依赖注入。
set用于封装Set类型属性的依赖注入。
map用于封装Map类型属性的依赖注入。
entry的子元素用于设定一个键值对。

在开发过程中最常使用的就是普通的构造器实例化方法:spring容器默认调用类中的无参构造方法对Bean进行实例化。

bean的作用域

作用域描述
singleton在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。
prototype每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。
request每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的Spring WebApplicationContext环境。
session同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的Spring WebApplicationContext环境。
application限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。

基于注解Annotation的装配
虽然基于xml配置文件也能实现bean的装配工作(bean的装配就是指的bean的依赖注入),但是代码过于臃肿,所以基于注解的装配就明显方便很多。

点击此处详细学习——Spring基于Annotation装配Bean

相关约束信息,可在index.html——core1.9中找到。
在这里插入图片描述

使用注解之后,spring容器就只需要简单的一行代码。对于spring 4.0以上版本需要导入spring-aop的jar包(在框架包的libs文件夹下)
在这里插入图片描述
在这里插入图片描述
代码:

package com.csdn1.entity;

public interface UserDao {
	public void say();
}

package com.csdn1.entity;

import org.springframework.stereotype.Repository;

@Repository("userDao")
public class UserDaoImplement implements UserDao{

	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("com.csdn1.entity.UserDaoImplement:你已经成功创建了一个java类。。");
	}

	

}

package com.csdn1.entity;

public interface UserService {
	public  void say();
}

package com.csdn1.entity;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

@Service("userService")
public class UserServiceImplement implements UserService{
	@Resource(name="userDao")
	UserDao beServicedUser;
	
	public void setBeServicedUser(UserDao beServicedUser) {
		this.beServicedUser = beServicedUser;
	}
	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("com.csdn1.entity.UserServiceImplement:你创建了一个UserService类");
		beServicedUser.say();		
	}

}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.csdn1.entity"/>
</beans>
package com.csdn1.entity;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext applicationContext=
				new ClassPathXmlApplicationContext("beans.xml");
		UserService userService=
				(UserService)applicationContext.getBean("userService");
		userService.say();
		
	}

}

自动装配:
点击此处详细学习
采用注解方式进行装配,就无法对bean的作用域进行赋值。
但是使用自动装配,在调用者的属性名称就必须要与配置文件中定义的Bean做匹配,不能像注解方法一样随便进行取名。

在这里插入图片描述

package com.csdn1.entity;

public interface UserDao {
	public void say();
}

package com.csdn1.entity;


public class UserDaoImplement implements UserDao{

	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("com.csdn1.entity.UserDaoImplement:你已经成功创建了一个java类。。");
	}

	

}

package com.csdn1.entity;

public interface UserService {
	public  void say();
}

package com.csdn1.entity;



public class UserServiceImplement implements UserService{
	UserDao userDao;
	
	
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}


	@Override
	public void say() {
		// TODO Auto-generated method stub
		System.out.println("com.csdn1.entity.UserServiceImplement:你创建了一个UserService类");
		userDao.say();		
	}

}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

   <bean id="userDao" class="com.csdn1.entity.UserDaoImplement"></bean>
   <bean id="userService" class="com.csdn1.entity.UserServiceImplement" autowire="byName"></bean>
</beans>
package com.csdn1.entity;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext applicationContext=
				new ClassPathXmlApplicationContext("beans.xml");
		UserService userService=
				(UserService)applicationContext.getBean("userService");
		userService.say();
		
	}

}

实验1:集合类型注入
编写UserInfo类,包含用户姓名、性别、年龄、出生年月、个人爱好(list集合),采用set注入和构造注入两种方式,实现这些属性值的注入,并在测试程序中显示所有属性的值。
实验2:编写工厂类(BeanFactory)、Print类(属性:pName、pColor等),要求利用Spring容器通过工厂类BeanFactory生成Print对象。
实验3:利用Spring框架,通过注解方式实现为自己的校园卡充值。
在Dao层建立CardDao类,编写充值方法,实现充值(在控制台显示充值金额),在Biz层建立CardBiz类,编写充值方法,调用Dao层中的充值方法,完成充值。在CardController类中编写充值方法调用CardBiz的充值方法。在程序中,通过代码方式调用控制层充值方法,完成充值,并在控制台显示充值金额。在实现过程中不能利用new 操作来完成类的实例化。观察@Autowired和@Resource进行注解时有何不同。
实验4:根据自己的理解,描述 Bean的装配方式。

T2_Myfactory.java
在这里插入图片描述
T2_Print.java
在这里插入图片描述
T2_Test.java
在这里插入图片描述
T2_PrintImplement.java
在这里插入图片描述
在这里插入图片描述
实验2:
UserInfo.java
在这里插入图片描述
userService.java
在这里插入图片描述
UserInfo_Implement.java
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实验3:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行结果
实验1、
在这里插入图片描述

实验2、在这里插入图片描述
实验3、
在这里插入图片描述

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值