二、Spring中的Bean

目录

一、Bean的配置

 二、Bean的实例化

1、构造器实例化

2、静态工厂方式实例化

3、实例工厂方式实例化

三、Bean的作用域

 四、Bean的生命周期

五、Bean的装配方式

(1)基于XML的装配

(2)基于注解(Annotation)的装配


一、Bean的配置

如果把Spring看做一个大型工厂,则Spring容器中的Bean就是该工厂的产品。要想使用这个工厂生产和管理Bean,就需要在配置文件中告诉它需要哪些Bean,以及需要使用何种方式将这些Bean装配到一起。
小提示: Bean的本质就是Java中的类,而Spring中的Bean其实就是对实体类的引用,来生产Java类对象,从而实现生产和管理 Bean

 二、Bean的实例化

在面向对象的程序中,想要使用某个对象,就需要先实例化这个对象。同样,在Spring中,要想使用容器中的Bean,也需要实例化Bean。实例化Bean有三种方式,分别为构造器实例化静态工厂方式实例化实例工厂方式实例化(其中最常用的是构造器实例化)。
对应Java基础中的创建对象的方式:

假如有一个类Bean1
创建一个Bean1类的对象

(1)Bean1 bean = new Bean1();

(2)Bean1Factory

                //静态
              public static Bean1 creatBean1(){
                  return new Bean1();
             }
         Bean1Factory.creatBean1();//创建Bean1的对象的方法

(3)Bean1Factory

                //非静态
                  public Bean1 creatBean1(){
                        return new Bean1();
                  }
         Bean1Factory bean1factory = new Bean1Factory();

         bean1factory .creatBean1();

1、构造器实例化

构造器实例化是指Spring容器通过Bean对应的类中默认的构造函数来实例化Bean。接下来演示构造器实例化的使用:
(1)创建Web项目,导入相关Jar包;
(2)创建名为Bean1的Java类;

/**
 * 空类默认有什么?
 * 1.默认继承了Object类
 * 2.有一个默认无参构造方法
 * */

public class Bean1 {
}

(3)创建Spring配置文件beans1.xml,并配置Beanl实体类Bean;

<?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-4.3.xsd">
        
     
  <bean id="bean1" class="com.ssm.Bean1" scope="prototype"></bean>
              <!--scope="singleton" 地址相同 scope="prototype" 创建新的 地址不同-->
</beans> 

 

(4)创建测试类,测试程序。

public class Test {
    public static void main(String[] args) {
        //1.加载xml配置文件,初始化容器
        String xmlPath = "com/ssm/Bean1.xml";
        ApplicationContext  applicationContext =

                                        new  ClassPathXmlApplicationContext(xmlPath);
        //2.通过容器获取实例对象
        Bean1 bean1 =(Bean1) applicationcontext.getBean("bean1");

        //3.使用实例对象
        system.out.println(bean1);
//    system.out.println(bean1.tostring);
    }

}

(5)输出结果

com.ssm.Bean1@3a03464】

2、静态工厂方式实例化

静态工厂是实例化Bean的另一种方式。该方式要求自己创建一个静态工厂的方法来创建Bean的实例。接下来演示静态工厂实例化的使用:

(1)创建名为Bean2的Java类;

public class Bean2 {

}

(2)创建一个Java工厂类,在类中使用静态方法获取Bean2实例;

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

}

(3)创建Spring配置文件beans2.xml,并配置工厂类Bean;

<?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-4.3.xsd">
        
        <bean id="bean2" class="com.ssm.static_factory.MyBean2Factory"
            factory-method="createBean2"></bean>

</beans> 

(4)创建测试类,测试程序。

public class Testioc {
    public static void main(String[] args) {
        //1.加载xml配置文件,初始化容器
        String xmlPath = "com/ssm/static_factory/Bean2.xml";
        ApplicationContext  applicationContext =

                                new ClassPathXmlApplicationContext(xmlPath);
        //2.通过容器获取实例对象
        Bean2 bean2 =(Bean2)applicationContext.getBean("bean2");
        //3.使用实例对象
        System.out.println(bean2);
    }

}

(5)输出结果

com.ssm.static_factory.Bean2@13a57a3b】

3、实例工厂方式实例化

该方式不再使用静态方法创建Bean实例,而是采用直接创建Bean实例的方法。接下来演示实例工厂方式实例化的使用:

(1)创建名为Bean3的Java类;

public class Bean3 {

}

(2)创建一个Java工厂类,在类中使用非静态方式获取Bean3实例;

public class MyBean3Factory {
    public Bean3 creatBean3() {
        return new Bean3();
    }
}

(3)创建Spring配置文件beans3.xml,并配置工厂类Bean;

<?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-4.3.xsd">
        
        <bean id="myBean3Factory" class="com.ssm.factory.MyBean3Factory"></bean>
 <bean id="bean3" factory-bean="myBean3Factory" factory-method="creatBean3"></bean>

</beans> 

(4)创建测试类,测试程序。

public class Testioc {
    public static void main(String[] args) {
        //1.加载xml配置文件,初始化容器
        String xmlPath = "com/ssm/factory/Bean3.xml";
        ApplicationContext  applicationContext =

                                new ClassPathXmlApplicationContext(xmlPath);
        //2.通过容器获取实例对象
        Bean3 bean3 =(Bean3)applicationContext.getBean("bean3");
        //3.使用实例对象
        System.out.println(bean3);
    }

}

(5)输出结果

com.ssm.factory.Bean3@13a57a3b】

三、Bean的作用域

singletonprototype是最常用的两种作用域。【没写默认singleton单例模式

 四、Bean的生命周期

Spring容器可以管理Bean部分作用域的生命周期。

五、Bean的装配方式

Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring容器支持多种形式的Bean的装配方式,如基于XML的装配基于注解(Annotation)的装配自动装配(其中最常用的是基于注解的装配),将主要讲解这三种装配方式的使用。

(1)基于XML的装配

(1)创建Java类,提供有参无参构造以及属性setter方法;

【快捷键:右击空白处-->Source-->Generate Constructor using Fields.../
Generate Constructors from Superclass.../Generate Getters and Setters...】
 

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;
    }
    public User() {
        super();
        // TODO Auto-generated constructor stub
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + ", list=" + list + "]";
    }
    

}

(2)创建Spring配置文件beans5.xml,使用2种方式配置Bean;

<?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-4.3.xsd">


     <!--用构造注入方式装配User对象  -->   
       <bean id="user1" class="com.ssm.assemble.User">
       <constructor-arg index="0" value="张三"></constructor-arg>
       <constructor-arg index="1" value="123456"></constructor-arg>
       <constructor-arg index="2">
           <list>
               <value>"张四"</value>
               <value>"张五"</value>
               <value>"张六"</value>
           </list>
       </constructor-arg>
       </bean>
       
       
       <!-- 用设置注入 -->
       <bean id="user2" class="com.ssm.assemble.User">
               <property name="username" value="李四"></property><!--name的值是类的成员属性  -->
               <property name="password" value="654321"></property>
               <property name="list">
                   <list>
                       <value>"李四"</value>
                       <value>"李五"</value>
                       <value>"李六"</value>
                   </list>
               </property>
       </bean>
</beans> 

(3)创建测试类,测试程序。

public class Testioc {
    public static void main(String[] args) {
        //1.加载xml配置文件,初始化容器
        String xmlPath = "com/ssm/assemble/Bean5.xml";
        ApplicationContext  applicationContext =

                         new ClassPathXmlApplicationContext(xmlPath);
        //2.通过容器获取实例对象
        User user1 =(User) applicationContext.getBean("user1");
        //3.使用实例对象
        System.out.println(user1);
        
        User user2 =(User) applicationContext.getBean("user2");
        //3.使用实例对象
        System.out.println(user2);
    }

}

(2)基于注解(Annotation)的装配

基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带束一定的困难。为此,Spring提供了对Annotation(注解)技术的全面支持。
@Component:用于描述Spring中的Bean,它是一个泛化的概念,仅仅表示一个组件。
@Repository:用于将数据访问层(DAO)的类标识为Spring中的Bean 。

@Service:用于将业务层(Service)的类标识为Spring中的Bean。
@Controller:用于将控制层(Controller)的类标识为Spring中的Bean

@Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。
@Resource:其作用与Autowired一样。@Resource中有两个重要属性: name和type。Spring将name属性解析为Bean实例名称,type属性解析为Bean实例类型。
@Qualifier:与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的实例名称装配,Bean的实例名称山@Qualifier注解的参数指定。 

 

---------------------------------------------------------------UserDao.java

public interface UserDao {
    void save();
}

---------------------------------------------------------------UserDaoImpl.java

//@Repository("userDao")--相当于new了对象,不用bean了
@Repository//默认名字是类名首字母小写userDaoImpl
public class UserDaoImpl implements UserDao{

    @Override
    public void save() {
        System.out.println("userDao...save...");
    }

}

------------------------------------------------------------------------UserService.java

public interface UserService {
    void save();
}

--------------------------------------------------------------------------UserServiceImpl.java

//@Service("userService")
@Service
public class UserServiceImpl implements UserService{
    
    //@Resource(name="userDao")//实例对象
    //@Resource
    @Autowired//@Resource和@Autowired都行,经常用Autowired
    private UserDao userDao;//属性

    @Override
    public void save() {
        this.userDao.save();
        System.out.println("userService...save...");
        
    }

}

------------------------------------------------------------------------------------UserController.java

//@Controller("userController")
@Controller
public class UserController {
    
    //@Resource(name="userService")
    @Autowired
    private UserService userService;
    
    public void save() {
        this.userService.save();
        System.out.println("userController...save...");
        
    }
}

-------------------------------------------------------------------------------------Bean6.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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
      <!-- 开启注解,用到context约束 -->
      <context:annotation-config></context:annotation-config> 

       
       
      <!-- <bean id="userDao" class="com.ssm.annotation.UserDaoImpl"></bean>  
      <bean id="userService" class="com.ssm.annotation.UserServiceImpl"></bean>  
      <bean id="userController" class="com.ssm.annotation.UserController"></bean>   -->
      <!-- 扫描包下所有东西 --> 
      <context:component-scan base-package="com.ssm.annotation"></context:component-scan>      
  
</beans> 

-----------------------------------------------------------------------------------------Testioc.java

public class Testioc {
    public static void main(String[] args) {
        //1.加载xml配置文件,初始化容器
        String xmlPath = "com/ssm/annotation/Bean6.xml";
        ApplicationContext  applicationContext =

                                                 new ClassPathXmlApplicationContext(xmlPath);
        //2.通过容器获取实例对象
        UserController userController =

                                (UserController) applicationContext.getBean("userController");
        userController.save(); 
    }

}

结果

用到的jar包

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值