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