美文网首页
Spring初步学习(二)

Spring初步学习(二)

作者: 大炮对着虫子 | 来源:发表于2017-10-15 11:21 被阅读13次

spring配置文件中每个bean默认为单例的,即通过配置scope的属性

  <bean id="dog" class="com.icss.model.Dog" scope="singleton">
        <property name="dogName" value="小汪"></property>
    </bean>

多例

    <bean id="person" class="com.icss.model.Person" scope="prototype">
    </bean>

单实例的bean组件默认初始化的时间是:spring容器初始化的时候实例化
多实例的bean组件默认初始化时间是:每次访问的时候实例化

可以指定单实例的bean组件在第一次访问的时候实例化:

<bean id="" class="" lazy-init="true"></bean>

当我们加载bean时,可能需要对其进行初始化操作,当我们关闭spring容器时,可能需要对bean进行销毁操作。spring提供了init-methoddestroy-method进行配置。
单例的bean下,我们给person新添加了init()方法和destroy方法

public class Person {

    private String name;
    private String age;
    //初始化的方法
    public void init()
    {
        System.out.println("我开始初始化啦");
    }
    public void destroy()
    {
        System.out.println("我销毁啦");
    }
    
    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public String getAge() {
        return age;
    }


    public void setAge(String age) {
        this.age = age;
    }


    public void eat()
    {
        System.out.println("人类必须要吃食物,否则挂掉");
    }
}

通过配置文件绑定

<bean id="person" class="com.icss.model.Person" init-method="init" 
    destroy-method="destroy">
    </bean>

当我们运行测试代码:

    @Test
    public void testD(){
//      获取spring容器对象
        ClassPathXmlApplicationContext ac = 
                new ClassPathXmlApplicationContext("applicationContext.xml");
//      获取容器中管理的对象,getBean方法中的参数即为bean的id属性值
        Person person = (Person) ac.getBean("person");
//      测试容器实例化的对象是否成功
        
        person.eat();
        ac.close();
        //System.out.println(boy.getDog().getDogName());
        
    }

结果:

单例下的自定义初始化和销毁函数

当我们将person设置成多例prototype时,spring不能够去执行销毁函数,原因:根据java的垃圾回收机制,如果是单例,它的生命周期是和容器的生命周期一致的,而且只有一个。如果是多例的话,创建多个不及时销售,会造成内存溢出

DI 依赖注入:

(手动注入)构造函数传入值:

<bean>
<constructor-arg index="0" value=""></constructor-arg>
</bean>

`(手动注入)setter方法注入

<property name="" value=""></property>
<property name="" ref=""></property>

自动注入:

ByName和ByType

byType:按类型匹配,如果容器中有多个同种类型的对象,依赖注入失败。
byName:按bean的id匹配,属性名与bean的id属性值保持一致。

    <bean id="student" class="com.icss.model.student"
 autowire="byName">
    </bean>
<bean id="person" class="com.icss.model.person" >
</bean>
通过注解实现:

Spring 3.0以后版本可使用
1、导入jar包 AOP的jar包
2、需要有context包

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        

修改spring配置文件的信息

<?xml version="1.0" encoding="UTF-8"?>
<!-- 命名空间、指定标签满足w3c的规范、指定约束文件的路径(命名空间+约束文件的路径) -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
    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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        ">

    
    
</beans>

加入context文件约束。值得注意的一点是,顺序不能乱,context后面需要紧接着.xsd

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

开启自动扫描:配置有注解的包,对其进行扫描

<context:component-scan base-package="com.xinge.*"></context:component-scan>

注解配置:
@Component (不知所在)
@Service (服务层)
@Repository (dao层)
@Controller(value="userServlet")

@Resource(name="userDao") 初始化对象中的Bean组件类型的属性值
@AutoWired 自动注入
@Scope(value="prototype")

例子:

@Repository
public class UserDao
 {
}


@Service(value="userService")
public class UserService {
//自动注入的方式,当然,也可以@Resource
    @Autowired
    private UserDao dao;
    
    
    public UserDao getDao() {
        return dao;
    }


    public void setDao(UserDao dao) {
        this.dao = dao;
    }
}

@Controller
@WebServlet("/LoginServlet.do")
public class LoginServlet extends HttpServlet {
    @Resource(name="userService")
    private UserService Ser;
    
    public UserService getSer() {
        return Ser;
    }

    public void setSer(UserService ser) {
        Ser = ser;
    }
}

相关文章

网友评论

      本文标题:Spring初步学习(二)

      本文链接:https://www.haomeiwen.com/subject/euovyxtx.html