目录
set方法赋值
创建 UserDaoIm类的userdao对象
创建UserService类的userService对象,通过类中的set方法为私有属性user赋值为userdao
<bean id="userdao" class="com.pyj.spring5.dao.UserDaoIm"></bean>
<bean id="userService" class="com.pyj.spring5.service.UserService">
<property name="user" ref="userdao"></property>
</bean>
构造方法赋值
通过类中的构造方法为UserService2赋值。ref接收对象,value接收值
<bean id="userdao2" class="com.pyj.spring5.dao.UserDao2"></bean>
<bean id="userservice" class="com.pyj.spring5.service.UserService2">
//从外部注入bean对象
<constructor-arg name="userdao" ref="userdao2"></constructor-arg>
<constructor-arg name="address" value="中国"></constructor-arg>
</bean>
Spring中通过XML获得对象
//加载spring配置文件
ApplicationContext context=new ClassPathXmlApplicationContext("XML1.xml");
//获取配置文件创造的对象
UserService2 user=context.getBean("userservice",UserService2.class);
//UserService2 user=(UserService) context.getBean("userservice");
给对象属性赋特殊符号
<bean id="people" class="com.pyj.spring5.People">
<property name="name">
<value><![CDATA[<<四川>>]]></value>
</property>
</bean>
内部注入bean对象
在student对象内部创建people对象
<!-- 方法一 -->
<bean id="student" class="com.pyj.spring5.Student">
<!--设置普通属性-->
<property name="ID" value="20202107"></property>
<!--在类内部设置对象类属性-->
<property name="people">
<bean id="people" class="com.pyj.spring5.People">
<property name="name" value="陈百强"></property>
</bean>
</property>
</bean>
<!-- 方法二 外部注入对象内部为对象赋值-->
<bean id="student2" class="com.pyj.spring5.Student">
<!--设置普通属性-->
<property name="ID" value="20202107"></property>
<!--在类内部设置对象类属性-->
<property name="people" ref="people1"></property>
<!--在people中要设置people的get方法-->
<property name="people.name" value="陈百强"></property>
</bean>
<bean id="people1" class="com.pyj.spring5.People"></bean>
集合类型属性的注入
当前的所有集合类型都是String
<bean id="inte" class="com.pyj.spring5.Integreate">
<!-- 创建数组类型的属性-->
<property name="courses">
<array>
<value>数组1</value>
<value>数组2</value>
</array>
</property>
<!-- 创建list类型的属性-->
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
</list>
</property>
<!-- 创建map类型的属性-->
<property name="map">
<map>
<entry key="键1" value="值1"></entry>
<entry key="键2" value="值2"></entry>
</map>
</property>
</bean>
当集合的类型为对象时值的注入
<bean id="inte2" class="com.pyj.spring5.Inte">
<property name="list">
<list>
<ref bean="user1"></ref>
<ref bean="user2"></ref>
</list>
</property>
</bean>
<bean id="user1" class="com.pyj.spring5.User">
<property name="name" value="陈百强"></property>
<property name="age" value="35"></property>
</bean>
<bean id="user2" class="com.pyj.spring5.User">
<property name="name" value="张国荣"></property>
<property name="age" value="43"></property>
</bean>
在XML中使用公共的属性
使用时需要在spring配置文件中引入名称空间util
<?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:util="http://www.springframework.org/schema/util"<!-- 配置util-->
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsd"><!-- 配置util-->
<!-- 构建公共的属性值,命名为booklist-->
<util:list id="booklist">
<value>纯阳指</value>
<value>九阳神功</value>
<value>葵花宝典</value>
</util:list>
<bean id="bookclass" class="com.pyj.spring5.service.Inte3">
<property name="book" ref="booklist"></property>
</bean>
</beans>
工厂bean
通过实现FactoryBean接口,并重写getObject()方法实现在XML中虽然创建的是Mybean对象,但得到的却是User对象
public class Mybean implements FactoryBean {
@Override
public Object getObject() throws Exception {
User user=new User();
user.setAge(20);
user.setName("谭咏麟");
return user;
}
}
public class User {
private String name;
private int age;
public User() {
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
<bean id="mybean" class="com.pyj.spring5.service.Mybean"></bean>
结果是User{name='谭咏麟', age=20}
创建单实列对象和多实列对象
通过bean中的scope属性设置,默认情况下创建的对象为单例
<!--创建多例对象-->
<bean id="mybean" class="com.pyj.spring5.service.Mybean" scope="prototype"></bean>
<!--创建单例对象-->
<bean id="mybean" class="com.pyj.spring5.service.Mybean" scope="singleton"></bean>
bean的生命周期和后置处理器
后置处理器(可以在对象初始化前和初始化后调用自身的方法)
1.在XML中配置BOSS的实例对象和后置处理器,在该XML文件中所有的对象在被创建时后置处理器都会发挥作用
<bean id="boss" class="com.pyj.spring5.Boss" init-method="initMethod" destroy-method="destroyMethod">
<property name="name" value="大Boss"></property>
</bean>
<!--配置后置处理器(可以在对象初始化前和初始化后调用自身的方法),在该XML文件中所有的对象在被创建时后置处理器都会发挥作用-->
<bean id="myBeanPost" class="com.pyj.spring5.MyBeanPost"></bean>
Boss类
public class Boss {
private String name;
public Boss() {
System.out.println("第一步通过通过无参构造创建实例对象");
}
public void setName(String name) {
this.name = name;
System.out.println("第二步设置属性");
}
public void initMethod(){
System.out.println("第三步执行初始化方法");
}
public void destroyMethod(){
System.out.println("第五步销毁对象");
}
}
MyBeanPost类实现了后置处理器接口,并重写了方法
public class MyBeanPost implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("对象初始化之前执行的方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("对象初始化之后执行的方法");
return bean;
}
}
测试类
public void test9(){
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("XML3.xml");
Boss boss=context.getBean("boss",Boss.class);
System.out.println("第四步得到bean对象");
System.out.println(boss);
context.close();//手动销毁对象
}
结果
第一步通过通过无参构造创建实例对象
第二步设置属性
对象初始化之前执行的方法
第三步执行初始化方法
对象初始化之后执行的方法
第四步得到bean对象
com.pyj.spring5.Boss@33723e30
第五步销毁对象
引入外部属性文件
使用时需要在spring配置文件中引入名称空间contex
<!-- 引入外部属性文件-->
<context:property-placeholder location="classpath:JDBC.properties"/>
<!-- 配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
</bean>
引入的外部properties文件,注:在引入时properties中的键值不能和mysql的关键字一致
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=20001101pyj
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
测试程序
public void test10() throws Exception {
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("XML4.xml");
DataSource dataSource= (DataSource) context.getBean("dataSource");
Connection connection= dataSource.getConnection();
System.out.println(connection);
connection.close();
}
通过注解创建bean对象和注入属性
此方法可以使XML中的代码干净
使用时需要在spring配置文件中引入名称空间contex,并开启组件扫描(就是扫描注解)
<!-- 开启组件扫描-->
<context:component-scan base-package="com.pyj"></context:component-scan>
创建对象并给属性注入值
创建对象的注解
@Component(都可以)、@Service(规范:最好service层)、@Controller(规范:最好web层)、@Reposittory(规范:最好dao层)但四个注解可以混用,只是不规范
属性赋值的注解
Autowired(根据类型)、Qualifier(根据属性名注入,要和Autowired一起使用)、Resource(根据类型、根据属性名注入)、Value(注入常量值)
@Component(value = "user")//user等价与XML中bean的id,如果不写默认是类名且首字母小写
public class User {
@Autowired//根据类型对属性进行注入
private UserDao userDao;
@Autowired
@Qualifier(value = "userdao2")//Qualifier要和Autowired一起使用
private UserDao2 userDao2;
@Resource(name = "userdao3")//既可以实现类型注入亦可以实现属性注入
private UserDao3 userDao3;
@Value(value = "张国荣")//常量注入
private String name;
}
因为属性userDao、userDao2、userDao3是一个对象,所以要在这些对象的类上面添加创建对象的注解
@Component(value = "userdao")
public class UserDao{...}
在java中获得User实例对象
public void test1(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean2.xml");
User user=context.getBean("user", User.class);
}