2.Spring中的Bean——个人笔记

2.Spring中的Bean

理解:bean就是java类,引入spring管理java类,引入Spring之后,通过Spring管理的java类就是称之为bean。比如一个人身份证名字叫张三,学校里老师喊他叫张三,回家之后父母喊他叫狗蛋,不管喊什么人还是这个人,只是环境发生了变化,所以称呼不同。

2.1 实例化bean

2.1.1构造器实例化

1.创建一个bean1.java

public class Bean1 {

}

2.创建一个bean1.xml

<bean id="bean1" class="com.ntzhuima.instance.constructor.Bean1"></bean>

3.创建一个测试类

public class InstanceTest {
	public static void main(String[] args) {
        //路径从src下寻找
		String path = "com/ntzhuima/instance/constructor/beans1.xml";
		ApplicationContext application = new ClassPathXmlApplicationContext(path);
		Bean1 bean1 = (Bean1) application.getBean("bean1");
		System.out.println(bean1);
	}
}

注意:如何避免路径错误

点击文件–>右击–>选择 copy qualified name 这是路径带有"/"

打开java类的文件–>选中类名–>右击–>选择 copy qualified name 这是路径带有"."

2.1.2静态工厂实例化

1.创建一个bean2.java

public class Bean2 {

}

1.创建一个MyBean2Factory.java

public class MyBean2Factory {
	public static Bean2 createBean() {
		return new Bean2();
	}
}

3.创建一个bean1.xml

<bean id="bean2" class="com.ntzhuima.instance.static_factory.MyBean2Factory"
		 factory-method="createBean"></bean>

4.创建一个测试类

public class InstanceTest2 {
	public static void main(String[] args) {
		String path = "com/ntzhuima/instance/static_factory/beans2.xml";
		ApplicationContext application =  new ClassPathXmlApplicationContext(path);
		Bean2 bean2 = (Bean2) application.getBean("bean2");
		System.out.println(bean2);
	}

}

理解: 首先创建了一个需要使用的bean类,然后创建一个工厂,这个工厂就是专门管理创建bean的,但是如何跟xml文件结合起来呢?把xml中bean的class属性值配置成工厂,然后把属性factory-method的值配置成工厂的里的对象的方法名称。这样对应的逻辑就是(Bean2) application.getBean(“bean2”)——class=“com.ntzhuima.instance.static_factory.MyBean2Factory”—— factory-method=“createBean”——public static Bean2 createBean() {return new Bean2();}——Bean2 bean2

2.1.3实例化工厂实例化

理解:它与静态工厂实例化的区别就是在于他不需要静态的创建工厂,就是不需要写static。

直接上区别代码

区别1:工厂类

public class MyBean3Factory {
	public MyBean3Factory() {
		System.out.println("bean3 工厂实例化!");
	}
	public Bean3 createBean() {
		return new Bean3();
	}
}

区别2:xml文件的配置

<bean id="myBean3Factory" class="com.ntzhuima.instance.factory.MyBean3Factory"></bean>
<bean id="bean3" factory-bean="myBean3Factory" factory-method="createBean"></bean>

2.2作用域Scope

2.2.1 singleton

<bean id="scope" class="com.ntzhuima.scope.Scope" scope="singleton"></bean>

(Scope) application.getBean(“scope”)不管这个方法使用多少遍,他们都是代表同一个对象。Spring会管理singleton的生命周期。

2.2.2 prototype

<bean id="prototype" class="com.ntzhuima.scope.Prototype" scope="prototype"></bean>

(Prototype) application.getBean(“prototype”) 每次调用都是创建一个新的对象,Spring并不会跟踪他们的生命周期。

2.3Bean的装配方式

2.3.1基于XML的装配方式

public class User {
	private String username;
	private String password;
	private List<String> list;
	
	/*
	 * 使用构造注入,提供带所有参数的构造方法
	 */
	public User(String username, String password, List<String> list) {
		super();
		this.username = username;
		this.password = password;
		this.list = list;
	}
	
	/**
	 * 提供设值注入,提供默认空参构造方法,为所有属性提供setter方法
	 */
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}


	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public List<String> getList() {
		return list;
	}
	public void setList(List<String> list) {
		this.list = list;
	}

	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + ", list=" + list + "]";
	}
	
} 
2.3.1.1设值注入
<bean id="user2" class="com.ntzhuima.assemble.User">
		<property name="username" value="zzg1"></property>
		<property name="password" value="12345"></property>
		<property name="list">
			<list>
				<value>"setlistvalue1"</value>
				<value>"setlistvalue2"</value>
			</list>
		</property>
</bean>

通过xml直接赋值,但是如何通过得到id=user2来得到呢?是通过user中的setter来赋值的,所以说name都是对应了属性值。

2.3.1.2构造注入
<!-- 使用构造注入方法装配User实例 -->
<bean id="user1" class="com.ntzhuima.assemble.User">
	<constructor-arg index="0" value="zzg"></constructor-arg>
	<constructor-arg index="1" value="123456"></constructor-arg>
	<constructor-arg index="2">
		<list>
			<value>"constructorvalue1"</value>
			<value>"constructorvalue2"</value>
		</list>
	</constructor-arg>
</bean>

这里跟设值注入的区别在于构造器注入赋值是通过下标来完成的,public User(String username, String password, List list) 对应的就是User含参的构造器,顺序不可乱。

2.3.2基于Annotation的装配

理解: @Component这个注解用来描述Spring中的bean,可以表示任何层次,一般而言,@Repository表示dao层,@Service表示service层,@Controller表示controller层,@Resource与@Autowired作用差不多,都可以用来装配对象(就是实例化对象),虽然@Repository、@Service、@Controller与@Component功能相同,但是为什么还要如何名称不同呢?是为了具体化,比如说啊,他们四个都代表的是人这个概念,人有吃喝拉撒功能,他们也有,但是呢,他们从事的岗位不同,@Repository是一名清洁工,@Service他是一名厨师,@Controller是一名医生,只是表示他们的用途不同,给不同功能打上不同的标签。如:@Repository(“userDao”)功能相当于也相当于UserDao userDao = new UserDao();

用法一: annotation-config

<?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
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        ">
	<context:annotation-config />
	
	<bean id="userDao" class="com.ntzhuima.annotation.UserDaoImpl"></bean>
	<bean id="userService" class="com.ntzhuima.annotation.UserServiceImpl"></bean>
	<bean id="userController" class="com.ntzhuima.annotation.UserController"></bean>
	
</beans>

注意: 在beans标记的头部新增加了两行,我的理解就是想用什么标签就要引入什么,比如说想用<context:annotation-config />这个标签,我就要引入下边这两句话,就好像是,要使用java类,import一样。

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd

@Resource(name="userDao")
private UserDao userDao;

@Repository("userDao")
public class UserDaoImpl implements UserDao

上边的代码格式配合使用即可。

用法二: component-scan base-package

<context:component-scan base-package="com.ntzhuima.annotation" />	

用法三: 自动装配

<!-- bean元素中使用autowire属性来起到property+setter的作用 -->
	<bean id="userDao" class="com.ntzhuima.annotation.UserDaoImpl" ></bean>
	<bean id="userService" class="com.ntzhuima.annotation.UserServiceImpl" autowire="byName"></bean>
	<bean id="userController" class="com.ntzhuima.annotation.UserController" autowire="byName"></bean>

注意: autowire="byName"这个属性的特殊作用,就是相当于设值注入的property+setter;

源码:
链接:https://pan.baidu.com/s/1vZov7Yoze-c5AdJ-uguW9w
提取码:k4tm

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值