博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring笔记2
阅读量:5079 次
发布时间:2019-06-12

本文共 7682 字,大约阅读时间需要 25 分钟。

spring中bean的细节之作用范围**

bean对象的生命周期

单例对象:

出生:当容器创建是对象出生

活着:只要容器还在,对象一直活着

死亡:容器销毁,对象消亡

多例对象:

出生:当我们使用对象时spring框架为我们创建

活着:对象只要是在使用过程中就一直活着

死亡:当对象长时间不用,且没有别的对象引用是,由Java的垃圾回收器回收

spring的依赖注入

1.构造函数注入

首先定义可注入的变量

public class AccountServiceImpl implements IAccountService {    private String name;    private Integer age;    private Date birthday;    public AccountServiceImpl(String name,Integer age,Date birthday){        this.name = name;        this.age = age;        this.birthday = birthday;    }    public void  saveAccount(){        System.out.println(name+":"+age+":"+birthday);    }}

img

创建测试类调用对象方法,查看注入是否成功

public class Client {    public static void main(String[] args) {        //获取核心容器对象        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");        //2.根据id(唯一标识)获取Bean对象        IAccountService as = (IAccountService)ac.getBean("accountService");        System.out.println(as);    }}

img

set方法注入:

1.给属性提供set,get方法

package com.itheima.service.impl;import com.itheima.service.IAccountService;import java.util.Date;/** * 账户的业务层实现类 */public class AccountServiceImpl2 implements IAccountService {    private String name;    private Integer age;    private Date birthday;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }    public void  saveAccount(){        System.out.println(name+":"+age+":"+birthday);    }}

2.XML配置

3.测试类

package com.itheima.ui;import com.itheima.service.IAccountService;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * 模拟一个表现层,用于调用业务层 */public class Client {    public static void main(String[] args) {        //获取核心容器对象        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");        //2.根据id(唯一标识)获取Bean对象        IAccountService as = (IAccountService)ac.getBean("accountService2");       as.saveAccount();    }}

img

注入结合数据

1.类中添加集合属性

package com.itheima.service.impl;import com.itheima.service.IAccountService;import java.util.*;/** * 账户的业务层实现类 */public class AccountServiceImpl3 implements IAccountService {    private String[] myStrs;    private List
myList; private Set
mySet; private Map
myMap; private Properties myProps; public String[] getMyStrs() { return myStrs; } public void setMyStrs(String[] myStrs) { this.myStrs = myStrs; } public List
getMyList() { return myList; } public void setMyList(List
myList) { this.myList = myList; } public Set
getMySet() { return mySet; } public void setMySet(Set
mySet) { this.mySet = mySet; } public Map
getMyMap() { return myMap; } public void setMyMap(Map
myMap) { this.myMap = myMap; } public Properties getMyProps() { return myProps; } public void setMyProps(Properties myProps) { this.myProps = myProps; } public void saveAccount() { System.out.println(Arrays.toString(myStrs)); System.out.println(myList); System.out.println(mySet); System.out.println(myMap); System.out.println(myProps); }}

3.配置xml

数组中的元素使用value标签提供

李白
苏轼
辛弃疾
李白
苏轼
辛弃疾
李白
苏轼
辛弃疾
迪丽热巴
贾静雯

4.测试数据是否注入集合

package com.itheima.ui;        import com.itheima.service.IAccountService;        import org.springframework.context.ApplicationContext;        import org.springframework.context.support.ClassPathXmlApplicationContext;/** * 模拟一个表现层,用于调用业务层 */public class Client {    public static void main(String[] args) {        //获取核心容器对象        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");        //2.根据id(唯一标识)获取Bean对象        IAccountService as = (IAccountService)ac.getBean("accountService3");        as.saveAccount();    }}

img

使用注解创建对象

1.配置xml,告知spring注解存在的位置

2.加上注解:@Component

@Component//作用:用于把当前类对象存入spring容器中//属性 value:用于指定bean的id,当我们不写是,他的默认是当前类名,且首字母该小写public class AccountServiceImpl implements IAccountService {    private IAccountDao accountDao = new AccountDaoImpl();    public AccountServiceImpl(){        System.out.println("对象创建了");    }    public void  saveAccount(){ accountDao.saveAccount();    }}

由Component衍生的注解

Controller:一般用于表现层

Service:一般用在业务层

Repository:一般用在持久层

以上三个注解他们的作用和属性与Component是一模一样的,他们三个是spring框架为我们提供明确三层使用的注解,使我们的三层对象更加清晰

自动按照类型注入

Autowired注解:作用:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功

出现位置:可以是变量上,也可以是方法上

细节:在使用注解注入时,set方法就不是必须的

Qualifier注解:作用:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入时可以

属性value:用于指定注入bean的id。

Resource注解:作用:直接按照bean的id注入。它可以独立使用

属性name:用于指定bean的id。

以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实。另外,集合类型的注入只能通过XML来实现。

Value注解:作用用于注入基本类型和String类型的数据;

属性value:用于指定数据的值

Spring的新配置(取出xml的配置文件)

现在需要使用注解来去除 通过配置xml来获取的两个bean对象

实现方式

//Configuration 作用,指定当前类是一个配置类//ComponentScan 作用,用于通过注解指定spring在创建容器是要扫描的包//@Configuration@ComponentScan(basePackages = "com.itheima")//指定创建容器是要扫描的包public class SpringConfiguration {    //用于创建一个QueryRunner对象    @Bean(name="runner")//用于把当前方法的返回值作为bean对象存入spring的IoC容器中    public QueryRunner createQueryRunner(DataSource dataSource){        return new QueryRunner(dataSource);    }    // 创建数据源对象    @Bean(name="dataSource")    public DataSource createDataSource(){        ComboPooledDataSource ds = new ComboPooledDataSource();        try {            ds.setDriverClass("com.mysql.jdbc.Driver");        } catch (PropertyVetoException e) {            e.printStackTrace();        }        ds.setJdbcUrl("jdbc:mysql:///eesy");        ds.setUser("root");        ds.setPassword("12345");        return ds;    }}

在使用xml配置是获取容器是通过如下

ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

那么我们现在通过注解来获取容器就应该使用另外一个类来获取,如下

ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfiguration.class);

运行案例是报了错误:

NoSuchBeanDefinitionException: No qualifying bean of typeavailable: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:

具体错误信息如下

img

关键字:NoSuchBeanDefinitionException,说没有bean对象

原来是忘记在bean对象前加注解了dao层,和service层都要加

img

转载于:https://www.cnblogs.com/train99999/p/11210767.html

你可能感兴趣的文章
Python异常处理体系
查看>>
centos7.0 增加/usr分区的容量减少home分区的大小
查看>>
C#在线获取歌词(转)
查看>>
zabbix---添加主机
查看>>
如何查看SQL SERVER数据库当前连接数
查看>>
python开发记录第一篇
查看>>
python 对象/变量&赋值的几点思考
查看>>
斐波那契数列以及斐波那契数列的衍生形式 利用矩阵快速幂求解
查看>>
javascript面向对象(三):非构造函数的继承
查看>>
Docker与自动化测试及其测试实践
查看>>
chrome保存网页为单个文件(mht格式)
查看>>
Mysql的row_format(fixed与dynamic)
查看>>
Linux命令应用大词典-第42章 PostgreSQL数据库
查看>>
负数的二进制表示
查看>>
create-react-app设置proxy反向代理不起作用
查看>>
Node.js之http模块中类的关系详解之客户端(下)
查看>>
web 页面传值方法
查看>>
Spring MVC数据绑定大全 .
查看>>
使用log4j的邮件功能
查看>>
NLB负载情况下视图状态的消息身份验证代码 (MAC)失败
查看>>